{
 "cells": [
  {
   "cell_type": "code",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:41.869431Z",
     "start_time": "2025-05-28T11:14:33.803749Z"
    }
   },
   "source": "%use dataframe(0.14.2)",
   "outputs": [],
   "execution_count": 1
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## Overview of new features in 0.14.0 dev version \n",
    "DataFrame.castTo(df)\n",
    "\n",
    "DataFrame.readExcel new StringColumns parameter\n",
    "\n",
    "DataFrame.generateDataClasses()\n",
    "\n",
    "DataRowSchema API\n",
    "\n",
    "Iterable<T>.toDataFrame(columnName)"
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## `castTo` helps to reuse code in notebooks\n",
    "Let's say you have a few dataframes with the same schema. Often you'd need to execute the same code for each of them.\n",
    "Why? For example, to draw a plot for different periods of time, or process and print information from different sources.\n",
    " "
   ]
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:43.806548Z",
     "start_time": "2025-05-28T11:14:41.875063Z"
    }
   },
   "cell_type": "code",
   "source": [
    "val sample = DataFrame.readDelimStr(\"\"\"full_name,html_url,stargazers_count,topics,watchers\n",
    "JetBrains/JPS,https://github.com/JetBrains/JPS,23,\"[build-system]\",23\n",
    "\"\"\")\n",
    "sample"
   ],
   "outputs": [
    {
     "data": {
      "text/html": [
       "            <iframe onload=\"o_resize_iframe_out_1()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_1\" frameBorder=\"0\" srcdoc=\"        &lt;html theme='dark'&gt;\n",
       "        &lt;head&gt;\n",
       "            &lt;style type=&quot;text&sol;css&quot;&gt;\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover &gt; td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "&sol;* formatting *&sol;\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       ":root {\n",
       "    --scroll-bg: #f5f5f5;\n",
       "    --scroll-fg: #b3b3b3;\n",
       "}\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n",
       "    --scroll-bg: #3c3c3c;\n",
       "    --scroll-fg: #97e1fb;\n",
       "}\n",
       "body {\n",
       "    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n",
       "}\n",
       "body::-webkit-scrollbar {\n",
       "    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n",
       "    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n",
       "}\n",
       "body::-webkit-scrollbar-thumb {\n",
       "    background-color: var(--scroll-fg);\n",
       "}\n",
       "body::-webkit-scrollbar-track {\n",
       "    background-color: var(--scroll-bg);\n",
       "}\n",
       "            &lt;&sol;style&gt;\n",
       "        &lt;&sol;head&gt;\n",
       "        &lt;body&gt;\n",
       "            &lt;table class=&quot;dataframe&quot; id=&quot;df_352321536&quot;&gt;&lt;&sol;table&gt;\n",
       "\n",
       "&lt;p class=&quot;dataframe_description&quot;&gt;DataFrame: rowsCount = 1, columnsCount = 5&lt;&sol;p&gt;\n",
       "\n",
       "        &lt;&sol;body&gt;\n",
       "        &lt;script&gt;\n",
       "            (function () {\n",
       "    window.DataFrame = window.DataFrame || new (function () {\n",
       "        this.addTable = function (df) {\n",
       "            let cols = df.cols;\n",
       "            for (let i = 0; i &lt; cols.length; i++) {\n",
       "                for (let c of cols[i].children) {\n",
       "                    cols[c].parent = i;\n",
       "                }\n",
       "            }\n",
       "            df.nrow = 0\n",
       "            for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n",
       "            }\n",
       "            if (df.id === df.rootId) {\n",
       "                df.expandedFrames = new Set()\n",
       "                df.childFrames = {}\n",
       "                const table = this.getTableElement(df.id)\n",
       "                table.df = df\n",
       "                for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                    let col = df.cols[i]\n",
       "                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n",
       "                }\n",
       "            } else {\n",
       "                const rootDf = this.getTableData(df.rootId)\n",
       "                rootDf.childFrames[df.id] = df\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.computeRenderData = function (df) {\n",
       "            let result = []\n",
       "            let pos = 0\n",
       "            for (let col = 0; col &lt; df.cols.length; col++) {\n",
       "                if (df.cols[col].parent === undefined)\n",
       "                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n",
       "            }\n",
       "            for (let i = 0; i &lt; result.length; i++) {\n",
       "                let row = result[i]\n",
       "                for (let j = 0; j &lt; row.length; j++) {\n",
       "                    let cell = row[j]\n",
       "                    if (j === 0)\n",
       "                        cell.leftBd = false\n",
       "                    if (j &lt; row.length - 1) {\n",
       "                        let nextData = row[j + 1]\n",
       "                        if (nextData.leftBd) cell.rightBd = true\n",
       "                        else if (cell.rightBd) nextData.leftBd = true\n",
       "                    } else cell.rightBd = false\n",
       "                }\n",
       "            }\n",
       "            return result\n",
       "        }\n",
       "\n",
       "        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n",
       "            if (result.length === depth) {\n",
       "                const array = [];\n",
       "                if (pos &gt; 0) {\n",
       "                    let j = 0\n",
       "                    for (let i = 0; j &lt; pos; i++) {\n",
       "                        let c = result[depth - 1][i]\n",
       "                        j += c.span\n",
       "                        let copy = Object.assign({empty: true}, c)\n",
       "                        array.push(copy)\n",
       "                    }\n",
       "                }\n",
       "                result.push(array)\n",
       "            }\n",
       "            const col = cols[colId];\n",
       "            let size = 0;\n",
       "            if (col.expanded) {\n",
       "                let childPos = pos\n",
       "                for (let i = 0; i &lt; col.children.length; i++) {\n",
       "                    let child = col.children[i]\n",
       "                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n",
       "                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n",
       "                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n",
       "                    childPos += childSize\n",
       "                    size += childSize\n",
       "                }\n",
       "            } else {\n",
       "                for (let i = depth + 1; i &lt; result.length; i++)\n",
       "                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n",
       "                size = 1\n",
       "            }\n",
       "            let left = leftBorder\n",
       "            let right = rightBorder\n",
       "            if (size &gt; 1) {\n",
       "                left = true\n",
       "                right = true\n",
       "            }\n",
       "            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n",
       "            return size\n",
       "        }\n",
       "\n",
       "        this.getTableElement = function (id) {\n",
       "            return document.getElementById(&quot;df_&quot; + id)\n",
       "        }\n",
       "\n",
       "        this.getTableData = function (id) {\n",
       "            return this.getTableElement(id).df\n",
       "        }\n",
       "\n",
       "        this.createExpander = function (isExpanded) {\n",
       "            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n",
       "            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n",
       "            svg.classList.add(&quot;expanderSvg&quot;)\n",
       "            let path = document.createElementNS(svgNs, &quot;path&quot;)\n",
       "            if (isExpanded) {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n",
       "            } else {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n",
       "            }\n",
       "            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n",
       "            svg.appendChild(path)\n",
       "            return svg\n",
       "        }\n",
       "\n",
       "        this.renderTable = function (id) {\n",
       "\n",
       "            let table = this.getTableElement(id)\n",
       "\n",
       "            if (table === null) return\n",
       "\n",
       "            table.innerHTML = &quot;&quot;\n",
       "\n",
       "            let df = table.df\n",
       "            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n",
       "\n",
       "            &sol;&sol; header\n",
       "            let header = document.createElement(&quot;thead&quot;)\n",
       "            table.appendChild(header)\n",
       "\n",
       "            let renderData = this.computeRenderData(df)\n",
       "            for (let j = 0; j &lt; renderData.length; j++) {\n",
       "                let rowData = renderData[j]\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                let isLastRow = j === renderData.length - 1\n",
       "                header.appendChild(tr);\n",
       "                for (let i = 0; i &lt; rowData.length; i++) {\n",
       "                    let cell = rowData[i]\n",
       "                    let th = document.createElement(&quot;th&quot;);\n",
       "                    th.setAttribute(&quot;colspan&quot;, cell.span)\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId];\n",
       "                    if (!cell.empty) {\n",
       "                        if (col.children.length === 0) {\n",
       "                            th.innerHTML = col.name\n",
       "                        } else {\n",
       "                            let link = document.createElement(&quot;a&quot;)\n",
       "                            link.className = &quot;expander&quot;\n",
       "                            let that = this\n",
       "                            link.onclick = function () {\n",
       "                                col.expanded = !col.expanded\n",
       "                                that.renderTable(id)\n",
       "                            }\n",
       "                            link.appendChild(this.createExpander(col.expanded))\n",
       "                            link.innerHTML += col.name\n",
       "                            th.appendChild(link)\n",
       "                        }\n",
       "                    }\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (isLastRow)\n",
       "                        classes += &quot; bottomBorder&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        th.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(th)\n",
       "                }\n",
       "            }\n",
       "\n",
       "            &sol;&sol; body\n",
       "            let body = document.createElement(&quot;tbody&quot;)\n",
       "            table.appendChild(body)\n",
       "\n",
       "            let columns = renderData.pop()\n",
       "            for (let row = 0; row &lt; df.nrow; row++) {\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                body.appendChild(tr)\n",
       "                for (let i = 0; i &lt; columns.length; i++) {\n",
       "                    let cell = columns[i]\n",
       "                    let td = document.createElement(&quot;td&quot;);\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId]\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        td.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(td)\n",
       "                    let value = col.values[row]\n",
       "                    if (value.frameId !== undefined) {\n",
       "                        let frameId = value.frameId\n",
       "                        let expanded = rootDf.expandedFrames.has(frameId)\n",
       "                        let link = document.createElement(&quot;a&quot;)\n",
       "                        link.className = &quot;expander&quot;\n",
       "                        let that = this\n",
       "                        link.onclick = function () {\n",
       "                            if (rootDf.expandedFrames.has(frameId))\n",
       "                                rootDf.expandedFrames.delete(frameId)\n",
       "                            else rootDf.expandedFrames.add(frameId)\n",
       "                            that.renderTable(id)\n",
       "                        }\n",
       "                        link.appendChild(this.createExpander(expanded))\n",
       "                        link.innerHTML += value.value\n",
       "                        if (expanded) {\n",
       "                            td.appendChild(link)\n",
       "                            td.appendChild(document.createElement(&quot;p&quot;))\n",
       "                            const childTable = document.createElement(&quot;table&quot;)\n",
       "                            childTable.className = &quot;dataframe&quot;\n",
       "                            childTable.id = &quot;df_&quot; + frameId\n",
       "                            let childDf = rootDf.childFrames[frameId]\n",
       "                            childTable.df = childDf\n",
       "                            td.appendChild(childTable)\n",
       "                            this.renderTable(frameId)\n",
       "                            if (childDf.nrow !== childDf.totalRows) {\n",
       "                                const footer = document.createElement(&quot;p&quot;)\n",
       "                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n",
       "                                td.appendChild(footer)\n",
       "                            }\n",
       "                        } else {\n",
       "                            td.appendChild(link)\n",
       "                        }\n",
       "                    } else if (value.style !== undefined) {\n",
       "                        td.innerHTML = value.value\n",
       "                        td.setAttribute(&quot;style&quot;, value.style)\n",
       "                    } else td.innerHTML = value\n",
       "                    this.nodeScriptReplace(td)\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.nodeScriptReplace = function (node) {\n",
       "            if (this.nodeScriptIs(node) === true) {\n",
       "                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n",
       "            } else {\n",
       "                let i = -1, children = node.childNodes;\n",
       "                while (++i &lt; children.length) {\n",
       "                    this.nodeScriptReplace(children[i]);\n",
       "                }\n",
       "            }\n",
       "\n",
       "            return node;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptClone = function (node) {\n",
       "            let script = document.createElement(&quot;script&quot;);\n",
       "            script.text = node.innerHTML;\n",
       "\n",
       "            let i = -1, attrs = node.attributes, attr;\n",
       "            while (++i &lt; attrs.length) {\n",
       "                script.setAttribute((attr = attrs[i]).name, attr.value);\n",
       "            }\n",
       "            return script;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptIs = function (node) {\n",
       "            return node.tagName === 'SCRIPT';\n",
       "        }\n",
       "    })()\n",
       "\n",
       "    window.call_DataFrame = function (f) {\n",
       "        return f();\n",
       "    };\n",
       "\n",
       "    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n",
       "    if (funQueue) {\n",
       "        funQueue.forEach(function (f) {\n",
       "            f();\n",
       "        });\n",
       "        funQueue = [];\n",
       "    }\n",
       "})()\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;full_name: String&bsol;&quot;&gt;full_name&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;JetBrains&sol;JPS&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;html_url: URL&bsol;&quot;&gt;html_url&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;JPS' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;JPS&lt;&sol;a&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;stargazers_count: Int&bsol;&quot;&gt;stargazers_count&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;23&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;topics: String&bsol;&quot;&gt;topics&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;[build-system]&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;watchers: Int&bsol;&quot;&gt;watchers&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;23&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "], id: 352321536, rootId: 352321536, totalRows: 1 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "call_DataFrame(function() { DataFrame.renderTable(352321536) });\n",
       "\n",
       "\n",
       "        &lt;&sol;script&gt;\n",
       "        &lt;&sol;html&gt;\"></iframe>\n",
       "            <script>\n",
       "                function o_resize_iframe_out_1() {\n",
       "                    let elem = document.getElementById(\"iframe_out_1\");\n",
       "                    resize_iframe_out_1(elem);\n",
       "                    setInterval(resize_iframe_out_1, 5000, elem);\n",
       "                }\n",
       "                function resize_iframe_out_1(el) {\n",
       "                    let h = el.contentWindow.document.body.scrollHeight;\n",
       "                    el.height = h === 0 ? 0 : h + 41;\n",
       "                }\n",
       "            </script>        <html theme='dark'>\n",
       "        <head>\n",
       "            <style type=\"text/css\">\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover > td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "/* formatting */\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       "            </style>\n",
       "        </head>\n",
       "        <body>\n",
       "            <table class=\"dataframe\" id=\"static_df_352321537\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">full_name</th><th class=\"bottomBorder\" style=\"text-align:left\">html_url</th><th class=\"bottomBorder\" style=\"text-align:left\">stargazers_count</th><th class=\"bottomBorder\" style=\"text-align:left\">topics</th><th class=\"bottomBorder\" style=\"text-align:left\">watchers</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\">JetBrains/JPS</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/JPS</td><td  style=\"vertical-align:top\">23</td><td  style=\"vertical-align:top\">[build-system]</td><td  style=\"vertical-align:top\">23</td></tr></tbody></table>\n",
       "        </body>\n",
       "        <script>\n",
       "            document.getElementById(\"static_df_352321537\").style.display = \"none\";\n",
       "        </script>\n",
       "        </html>"
      ],
      "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"full_name\",\"html_url\",\"stargazers_count\",\"topics\",\"watchers\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"java.net.URL\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"}],\"nrow\":1,\"ncol\":5},\"kotlin_dataframe\":[{\"full_name\":\"JetBrains/JPS\",\"html_url\":\"https://github.com/JetBrains/JPS\",\"stargazers_count\":23,\"topics\":\"[build-system]\",\"watchers\":23}]}"
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:44.333681Z",
     "start_time": "2025-05-28T11:14:43.820705Z"
    }
   },
   "cell_type": "code",
   "source": [
    "// Function will throw an exception if schema of `this` don't match schema of `sample`\n",
    "fun AnyFrame.top10() = castTo(sample).sortByDesc { stargazers_count }.take(10)"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:45.464412Z",
     "start_time": "2025-05-28T11:14:44.337916Z"
    }
   },
   "cell_type": "code",
   "source": [
    "val repos = DataFrame.read(\"https://raw.githubusercontent.com/Kotlin/dataframe/f72655be9a6235eefa183de22f4e1c94ac539f02/data/jetbrains_repositories.csv\")\n",
    "repos.top10()"
   ],
   "outputs": [
    {
     "data": {
      "text/html": [
       "            <iframe onload=\"o_resize_iframe_out_2()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_2\" frameBorder=\"0\" srcdoc=\"        &lt;html theme='dark'&gt;\n",
       "        &lt;head&gt;\n",
       "            &lt;style type=&quot;text&sol;css&quot;&gt;\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover &gt; td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "&sol;* formatting *&sol;\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       ":root {\n",
       "    --scroll-bg: #f5f5f5;\n",
       "    --scroll-fg: #b3b3b3;\n",
       "}\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n",
       "    --scroll-bg: #3c3c3c;\n",
       "    --scroll-fg: #97e1fb;\n",
       "}\n",
       "body {\n",
       "    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n",
       "}\n",
       "body::-webkit-scrollbar {\n",
       "    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n",
       "    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n",
       "}\n",
       "body::-webkit-scrollbar-thumb {\n",
       "    background-color: var(--scroll-fg);\n",
       "}\n",
       "body::-webkit-scrollbar-track {\n",
       "    background-color: var(--scroll-bg);\n",
       "}\n",
       "            &lt;&sol;style&gt;\n",
       "        &lt;&sol;head&gt;\n",
       "        &lt;body&gt;\n",
       "            &lt;table class=&quot;dataframe&quot; id=&quot;df_352321538&quot;&gt;&lt;&sol;table&gt;\n",
       "\n",
       "&lt;p class=&quot;dataframe_description&quot;&gt;DataFrame: rowsCount = 10, columnsCount = 5&lt;&sol;p&gt;\n",
       "\n",
       "        &lt;&sol;body&gt;\n",
       "        &lt;script&gt;\n",
       "            (function () {\n",
       "    window.DataFrame = window.DataFrame || new (function () {\n",
       "        this.addTable = function (df) {\n",
       "            let cols = df.cols;\n",
       "            for (let i = 0; i &lt; cols.length; i++) {\n",
       "                for (let c of cols[i].children) {\n",
       "                    cols[c].parent = i;\n",
       "                }\n",
       "            }\n",
       "            df.nrow = 0\n",
       "            for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n",
       "            }\n",
       "            if (df.id === df.rootId) {\n",
       "                df.expandedFrames = new Set()\n",
       "                df.childFrames = {}\n",
       "                const table = this.getTableElement(df.id)\n",
       "                table.df = df\n",
       "                for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                    let col = df.cols[i]\n",
       "                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n",
       "                }\n",
       "            } else {\n",
       "                const rootDf = this.getTableData(df.rootId)\n",
       "                rootDf.childFrames[df.id] = df\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.computeRenderData = function (df) {\n",
       "            let result = []\n",
       "            let pos = 0\n",
       "            for (let col = 0; col &lt; df.cols.length; col++) {\n",
       "                if (df.cols[col].parent === undefined)\n",
       "                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n",
       "            }\n",
       "            for (let i = 0; i &lt; result.length; i++) {\n",
       "                let row = result[i]\n",
       "                for (let j = 0; j &lt; row.length; j++) {\n",
       "                    let cell = row[j]\n",
       "                    if (j === 0)\n",
       "                        cell.leftBd = false\n",
       "                    if (j &lt; row.length - 1) {\n",
       "                        let nextData = row[j + 1]\n",
       "                        if (nextData.leftBd) cell.rightBd = true\n",
       "                        else if (cell.rightBd) nextData.leftBd = true\n",
       "                    } else cell.rightBd = false\n",
       "                }\n",
       "            }\n",
       "            return result\n",
       "        }\n",
       "\n",
       "        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n",
       "            if (result.length === depth) {\n",
       "                const array = [];\n",
       "                if (pos &gt; 0) {\n",
       "                    let j = 0\n",
       "                    for (let i = 0; j &lt; pos; i++) {\n",
       "                        let c = result[depth - 1][i]\n",
       "                        j += c.span\n",
       "                        let copy = Object.assign({empty: true}, c)\n",
       "                        array.push(copy)\n",
       "                    }\n",
       "                }\n",
       "                result.push(array)\n",
       "            }\n",
       "            const col = cols[colId];\n",
       "            let size = 0;\n",
       "            if (col.expanded) {\n",
       "                let childPos = pos\n",
       "                for (let i = 0; i &lt; col.children.length; i++) {\n",
       "                    let child = col.children[i]\n",
       "                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n",
       "                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n",
       "                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n",
       "                    childPos += childSize\n",
       "                    size += childSize\n",
       "                }\n",
       "            } else {\n",
       "                for (let i = depth + 1; i &lt; result.length; i++)\n",
       "                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n",
       "                size = 1\n",
       "            }\n",
       "            let left = leftBorder\n",
       "            let right = rightBorder\n",
       "            if (size &gt; 1) {\n",
       "                left = true\n",
       "                right = true\n",
       "            }\n",
       "            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n",
       "            return size\n",
       "        }\n",
       "\n",
       "        this.getTableElement = function (id) {\n",
       "            return document.getElementById(&quot;df_&quot; + id)\n",
       "        }\n",
       "\n",
       "        this.getTableData = function (id) {\n",
       "            return this.getTableElement(id).df\n",
       "        }\n",
       "\n",
       "        this.createExpander = function (isExpanded) {\n",
       "            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n",
       "            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n",
       "            svg.classList.add(&quot;expanderSvg&quot;)\n",
       "            let path = document.createElementNS(svgNs, &quot;path&quot;)\n",
       "            if (isExpanded) {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n",
       "            } else {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n",
       "            }\n",
       "            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n",
       "            svg.appendChild(path)\n",
       "            return svg\n",
       "        }\n",
       "\n",
       "        this.renderTable = function (id) {\n",
       "\n",
       "            let table = this.getTableElement(id)\n",
       "\n",
       "            if (table === null) return\n",
       "\n",
       "            table.innerHTML = &quot;&quot;\n",
       "\n",
       "            let df = table.df\n",
       "            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n",
       "\n",
       "            &sol;&sol; header\n",
       "            let header = document.createElement(&quot;thead&quot;)\n",
       "            table.appendChild(header)\n",
       "\n",
       "            let renderData = this.computeRenderData(df)\n",
       "            for (let j = 0; j &lt; renderData.length; j++) {\n",
       "                let rowData = renderData[j]\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                let isLastRow = j === renderData.length - 1\n",
       "                header.appendChild(tr);\n",
       "                for (let i = 0; i &lt; rowData.length; i++) {\n",
       "                    let cell = rowData[i]\n",
       "                    let th = document.createElement(&quot;th&quot;);\n",
       "                    th.setAttribute(&quot;colspan&quot;, cell.span)\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId];\n",
       "                    if (!cell.empty) {\n",
       "                        if (col.children.length === 0) {\n",
       "                            th.innerHTML = col.name\n",
       "                        } else {\n",
       "                            let link = document.createElement(&quot;a&quot;)\n",
       "                            link.className = &quot;expander&quot;\n",
       "                            let that = this\n",
       "                            link.onclick = function () {\n",
       "                                col.expanded = !col.expanded\n",
       "                                that.renderTable(id)\n",
       "                            }\n",
       "                            link.appendChild(this.createExpander(col.expanded))\n",
       "                            link.innerHTML += col.name\n",
       "                            th.appendChild(link)\n",
       "                        }\n",
       "                    }\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (isLastRow)\n",
       "                        classes += &quot; bottomBorder&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        th.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(th)\n",
       "                }\n",
       "            }\n",
       "\n",
       "            &sol;&sol; body\n",
       "            let body = document.createElement(&quot;tbody&quot;)\n",
       "            table.appendChild(body)\n",
       "\n",
       "            let columns = renderData.pop()\n",
       "            for (let row = 0; row &lt; df.nrow; row++) {\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                body.appendChild(tr)\n",
       "                for (let i = 0; i &lt; columns.length; i++) {\n",
       "                    let cell = columns[i]\n",
       "                    let td = document.createElement(&quot;td&quot;);\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId]\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        td.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(td)\n",
       "                    let value = col.values[row]\n",
       "                    if (value.frameId !== undefined) {\n",
       "                        let frameId = value.frameId\n",
       "                        let expanded = rootDf.expandedFrames.has(frameId)\n",
       "                        let link = document.createElement(&quot;a&quot;)\n",
       "                        link.className = &quot;expander&quot;\n",
       "                        let that = this\n",
       "                        link.onclick = function () {\n",
       "                            if (rootDf.expandedFrames.has(frameId))\n",
       "                                rootDf.expandedFrames.delete(frameId)\n",
       "                            else rootDf.expandedFrames.add(frameId)\n",
       "                            that.renderTable(id)\n",
       "                        }\n",
       "                        link.appendChild(this.createExpander(expanded))\n",
       "                        link.innerHTML += value.value\n",
       "                        if (expanded) {\n",
       "                            td.appendChild(link)\n",
       "                            td.appendChild(document.createElement(&quot;p&quot;))\n",
       "                            const childTable = document.createElement(&quot;table&quot;)\n",
       "                            childTable.className = &quot;dataframe&quot;\n",
       "                            childTable.id = &quot;df_&quot; + frameId\n",
       "                            let childDf = rootDf.childFrames[frameId]\n",
       "                            childTable.df = childDf\n",
       "                            td.appendChild(childTable)\n",
       "                            this.renderTable(frameId)\n",
       "                            if (childDf.nrow !== childDf.totalRows) {\n",
       "                                const footer = document.createElement(&quot;p&quot;)\n",
       "                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n",
       "                                td.appendChild(footer)\n",
       "                            }\n",
       "                        } else {\n",
       "                            td.appendChild(link)\n",
       "                        }\n",
       "                    } else if (value.style !== undefined) {\n",
       "                        td.innerHTML = value.value\n",
       "                        td.setAttribute(&quot;style&quot;, value.style)\n",
       "                    } else td.innerHTML = value\n",
       "                    this.nodeScriptReplace(td)\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.nodeScriptReplace = function (node) {\n",
       "            if (this.nodeScriptIs(node) === true) {\n",
       "                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n",
       "            } else {\n",
       "                let i = -1, children = node.childNodes;\n",
       "                while (++i &lt; children.length) {\n",
       "                    this.nodeScriptReplace(children[i]);\n",
       "                }\n",
       "            }\n",
       "\n",
       "            return node;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptClone = function (node) {\n",
       "            let script = document.createElement(&quot;script&quot;);\n",
       "            script.text = node.innerHTML;\n",
       "\n",
       "            let i = -1, attrs = node.attributes, attr;\n",
       "            while (++i &lt; attrs.length) {\n",
       "                script.setAttribute((attr = attrs[i]).name, attr.value);\n",
       "            }\n",
       "            return script;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptIs = function (node) {\n",
       "            return node.tagName === 'SCRIPT';\n",
       "        }\n",
       "    })()\n",
       "\n",
       "    window.call_DataFrame = function (f) {\n",
       "        return f();\n",
       "    };\n",
       "\n",
       "    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n",
       "    if (funQueue) {\n",
       "        funQueue.forEach(function (f) {\n",
       "            f();\n",
       "        });\n",
       "        funQueue = [];\n",
       "    }\n",
       "})()\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;full_name: String&bsol;&quot;&gt;full_name&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;JetBrains&sol;kotlin&quot;,&quot;JetBrains&sol;intellij-community&quot;,&quot;JetBrains&sol;kotlin-native&quot;,&quot;JetBrains&sol;compose-jb&quot;,&quot;JetBrains&sol;ideavim&quot;,&quot;JetBrains&sol;JetBrainsMono&quot;,&quot;JetBrains&sol;Exposed&quot;,&quot;JetBrains&sol;ring-ui&quot;,&quot;JetBrains&sol;kotlinconf-app&quot;,&quot;JetBrains&sol;create-react-kotlin-app&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;html_url: URL&bsol;&quot;&gt;html_url&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;kotlin' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;kotlin&lt;&sol;a&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;https:&sol;&sol;github.com&sol;JetBrains&sol;intellij-community&bsol;&quot;&gt;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;intellij-community' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;intellij&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;a&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;https:&sol;&sol;github.com&sol;JetBrains&sol;kotlin-native&bsol;&quot;&gt;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;kotlin-native' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;kotlin-n&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;a&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;compose-jb' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;compose-jb&lt;&sol;a&gt;&quot;,&quot;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;ideavim' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;ideavim&lt;&sol;a&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;https:&sol;&sol;github.com&sol;JetBrains&sol;JetBrainsMono&bsol;&quot;&gt;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;JetBrainsMono' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;JetBrain&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;a&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;Exposed' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;Exposed&lt;&sol;a&gt;&quot;,&quot;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;ring-ui' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;ring-ui&lt;&sol;a&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;https:&sol;&sol;github.com&sol;JetBrains&sol;kotlinconf-app&bsol;&quot;&gt;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;kotlinconf-app' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;kotlinco&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;a&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;https:&sol;&sol;github.com&sol;JetBrains&sol;create-react-kotlin-app&bsol;&quot;&gt;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;create-react-kotlin-app' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;create-r&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;a&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;stargazers_count: Int&bsol;&quot;&gt;stargazers_count&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;39402&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;12926&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;7101&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;6805&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;6120&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;6059&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;5688&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;2836&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;2628&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;2424&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;topics: String&bsol;&quot;&gt;topics&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[compiler, gradle-plugin, intellij-plugin, kotlin, kotlin-library, maven-plugin, programming-language]&bsol;&quot;&gt;[compiler, gradle-plugin, intellij-pl&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[code-editor, ide, intellij, intellij-community, intellij-platform]&bsol;&quot;&gt;[code-editor, ide, intellij, intellij&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;[c, compiler, kotlin, llvm, objective-c]&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[android, awt, compose, declarative-ui, desktop, gui, javascript, kotlin, multiplatform, reactive, swing, ui]&bsol;&quot;&gt;[android, awt, compose, declarative-u&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[ideavim, intellij, intellij-platform, jb-official, kotlin, vim, vim-emulator]&bsol;&quot;&gt;[ideavim, intellij, intellij-platform&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[coding-font, font, ligatures, monospaced-font, programming-font, programming-ligatures]&bsol;&quot;&gt;[coding-font, font, ligatures, monosp&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;[dao, kotlin, orm, sql]&quot;,&quot;[components, jetbrains-ui, react]&quot;,&quot;[]&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[create-react-app, jetbrains-ui, kotlin, react, webpack]&bsol;&quot;&gt;[create-react-app, jetbrains-ui, kotl&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;watchers: Int&bsol;&quot;&gt;watchers&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;39402&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;12926&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;7101&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;6805&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;6120&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;6059&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;5688&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;2836&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;2628&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;2424&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "], id: 352321538, rootId: 352321538, totalRows: 10 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "call_DataFrame(function() { DataFrame.renderTable(352321538) });\n",
       "\n",
       "\n",
       "        &lt;&sol;script&gt;\n",
       "        &lt;&sol;html&gt;\"></iframe>\n",
       "            <script>\n",
       "                function o_resize_iframe_out_2() {\n",
       "                    let elem = document.getElementById(\"iframe_out_2\");\n",
       "                    resize_iframe_out_2(elem);\n",
       "                    setInterval(resize_iframe_out_2, 5000, elem);\n",
       "                }\n",
       "                function resize_iframe_out_2(el) {\n",
       "                    let h = el.contentWindow.document.body.scrollHeight;\n",
       "                    el.height = h === 0 ? 0 : h + 41;\n",
       "                }\n",
       "            </script>        <html theme='dark'>\n",
       "        <head>\n",
       "            <style type=\"text/css\">\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover > td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "/* formatting */\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       "            </style>\n",
       "        </head>\n",
       "        <body>\n",
       "            <table class=\"dataframe\" id=\"static_df_352321539\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">full_name</th><th class=\"bottomBorder\" style=\"text-align:left\">html_url</th><th class=\"bottomBorder\" style=\"text-align:left\">stargazers_count</th><th class=\"bottomBorder\" style=\"text-align:left\">topics</th><th class=\"bottomBorder\" style=\"text-align:left\">watchers</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\">JetBrains/kotlin</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/kotlin</td><td  style=\"vertical-align:top\">39402</td><td  style=\"vertical-align:top\">[compiler, gradle-plugin, intellij-pl<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">39402</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/intellij-community</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/intellij<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">12926</td><td  style=\"vertical-align:top\">[code-editor, ide, intellij, intellij<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">12926</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/kotlin-native</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/kotlin-n<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">7101</td><td  style=\"vertical-align:top\">[c, compiler, kotlin, llvm, objective-c]</td><td  style=\"vertical-align:top\">7101</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/compose-jb</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/compose-jb</td><td  style=\"vertical-align:top\">6805</td><td  style=\"vertical-align:top\">[android, awt, compose, declarative-u<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">6805</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/ideavim</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/ideavim</td><td  style=\"vertical-align:top\">6120</td><td  style=\"vertical-align:top\">[ideavim, intellij, intellij-platform<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">6120</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/JetBrainsMono</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/JetBrain<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">6059</td><td  style=\"vertical-align:top\">[coding-font, font, ligatures, monosp<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">6059</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/Exposed</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/Exposed</td><td  style=\"vertical-align:top\">5688</td><td  style=\"vertical-align:top\">[dao, kotlin, orm, sql]</td><td  style=\"vertical-align:top\">5688</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/ring-ui</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/ring-ui</td><td  style=\"vertical-align:top\">2836</td><td  style=\"vertical-align:top\">[components, jetbrains-ui, react]</td><td  style=\"vertical-align:top\">2836</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/kotlinconf-app</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/kotlinco<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">2628</td><td  style=\"vertical-align:top\">[]</td><td  style=\"vertical-align:top\">2628</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/create-react-kotlin-app</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/create-r<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">2424</td><td  style=\"vertical-align:top\">[create-react-app, jetbrains-ui, kotl<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">2424</td></tr></tbody></table>\n",
       "        </body>\n",
       "        <script>\n",
       "            document.getElementById(\"static_df_352321539\").style.display = \"none\";\n",
       "        </script>\n",
       "        </html>"
      ],
      "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"full_name\",\"html_url\",\"stargazers_count\",\"topics\",\"watchers\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"java.net.URL\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"}],\"nrow\":10,\"ncol\":5},\"kotlin_dataframe\":[{\"full_name\":\"JetBrains/kotlin\",\"html_url\":\"https://github.com/JetBrains/kotlin\",\"stargazers_count\":39402,\"topics\":\"[compiler, gradle-plugin, intellij-plugin, kotlin, kotlin-library, maven-plugin, programming-language]\",\"watchers\":39402},{\"full_name\":\"JetBrains/intellij-community\",\"html_url\":\"https://github.com/JetBrains/intellij-community\",\"stargazers_count\":12926,\"topics\":\"[code-editor, ide, intellij, intellij-community, intellij-platform]\",\"watchers\":12926},{\"full_name\":\"JetBrains/kotlin-native\",\"html_url\":\"https://github.com/JetBrains/kotlin-native\",\"stargazers_count\":7101,\"topics\":\"[c, compiler, kotlin, llvm, objective-c]\",\"watchers\":7101},{\"full_name\":\"JetBrains/compose-jb\",\"html_url\":\"https://github.com/JetBrains/compose-jb\",\"stargazers_count\":6805,\"topics\":\"[android, awt, compose, declarative-ui, desktop, gui, javascript, kotlin, multiplatform, reactive, swing, ui]\",\"watchers\":6805},{\"full_name\":\"JetBrains/ideavim\",\"html_url\":\"https://github.com/JetBrains/ideavim\",\"stargazers_count\":6120,\"topics\":\"[ideavim, intellij, intellij-platform, jb-official, kotlin, vim, vim-emulator]\",\"watchers\":6120},{\"full_name\":\"JetBrains/JetBrainsMono\",\"html_url\":\"https://github.com/JetBrains/JetBrainsMono\",\"stargazers_count\":6059,\"topics\":\"[coding-font, font, ligatures, monospaced-font, programming-font, programming-ligatures]\",\"watchers\":6059},{\"full_name\":\"JetBrains/Exposed\",\"html_url\":\"https://github.com/JetBrains/Exposed\",\"stargazers_count\":5688,\"topics\":\"[dao, kotlin, orm, sql]\",\"watchers\":5688},{\"full_name\":\"JetBrains/ring-ui\",\"html_url\":\"https://github.com/JetBrains/ring-ui\",\"stargazers_count\":2836,\"topics\":\"[components, jetbrains-ui, react]\",\"watchers\":2836},{\"full_name\":\"JetBrains/kotlinconf-app\",\"html_url\":\"https://github.com/JetBrains/kotlinconf-app\",\"stargazers_count\":2628,\"topics\":\"[]\",\"watchers\":2628},{\"full_name\":\"JetBrains/create-react-kotlin-app\",\"html_url\":\"https://github.com/JetBrains/create-react-kotlin-app\",\"stargazers_count\":2424,\"topics\":\"[create-react-app, jetbrains-ui, kotlin, react, webpack]\",\"watchers\":2424}]}"
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:45.906557Z",
     "start_time": "2025-05-28T11:14:45.476038Z"
    }
   },
   "cell_type": "code",
   "source": [
    "// If there are mismatches in columns function shouldn't care about, use verify = false\n",
    "fun AnyFrame.top10_noVerify() = castTo(sample, verify = false).sortByDesc { stargazers_count }.take(10)\n",
    "\n",
    "repos.update { watchers }.withNull().top10_noVerify()"
   ],
   "outputs": [
    {
     "data": {
      "text/html": [
       "            <iframe onload=\"o_resize_iframe_out_3()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_3\" frameBorder=\"0\" srcdoc=\"        &lt;html theme='dark'&gt;\n",
       "        &lt;head&gt;\n",
       "            &lt;style type=&quot;text&sol;css&quot;&gt;\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover &gt; td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "&sol;* formatting *&sol;\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       ":root {\n",
       "    --scroll-bg: #f5f5f5;\n",
       "    --scroll-fg: #b3b3b3;\n",
       "}\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n",
       "    --scroll-bg: #3c3c3c;\n",
       "    --scroll-fg: #97e1fb;\n",
       "}\n",
       "body {\n",
       "    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n",
       "}\n",
       "body::-webkit-scrollbar {\n",
       "    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n",
       "    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n",
       "}\n",
       "body::-webkit-scrollbar-thumb {\n",
       "    background-color: var(--scroll-fg);\n",
       "}\n",
       "body::-webkit-scrollbar-track {\n",
       "    background-color: var(--scroll-bg);\n",
       "}\n",
       "            &lt;&sol;style&gt;\n",
       "        &lt;&sol;head&gt;\n",
       "        &lt;body&gt;\n",
       "            &lt;table class=&quot;dataframe&quot; id=&quot;df_352321540&quot;&gt;&lt;&sol;table&gt;\n",
       "\n",
       "&lt;p class=&quot;dataframe_description&quot;&gt;DataFrame: rowsCount = 10, columnsCount = 5&lt;&sol;p&gt;\n",
       "\n",
       "        &lt;&sol;body&gt;\n",
       "        &lt;script&gt;\n",
       "            (function () {\n",
       "    window.DataFrame = window.DataFrame || new (function () {\n",
       "        this.addTable = function (df) {\n",
       "            let cols = df.cols;\n",
       "            for (let i = 0; i &lt; cols.length; i++) {\n",
       "                for (let c of cols[i].children) {\n",
       "                    cols[c].parent = i;\n",
       "                }\n",
       "            }\n",
       "            df.nrow = 0\n",
       "            for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n",
       "            }\n",
       "            if (df.id === df.rootId) {\n",
       "                df.expandedFrames = new Set()\n",
       "                df.childFrames = {}\n",
       "                const table = this.getTableElement(df.id)\n",
       "                table.df = df\n",
       "                for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                    let col = df.cols[i]\n",
       "                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n",
       "                }\n",
       "            } else {\n",
       "                const rootDf = this.getTableData(df.rootId)\n",
       "                rootDf.childFrames[df.id] = df\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.computeRenderData = function (df) {\n",
       "            let result = []\n",
       "            let pos = 0\n",
       "            for (let col = 0; col &lt; df.cols.length; col++) {\n",
       "                if (df.cols[col].parent === undefined)\n",
       "                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n",
       "            }\n",
       "            for (let i = 0; i &lt; result.length; i++) {\n",
       "                let row = result[i]\n",
       "                for (let j = 0; j &lt; row.length; j++) {\n",
       "                    let cell = row[j]\n",
       "                    if (j === 0)\n",
       "                        cell.leftBd = false\n",
       "                    if (j &lt; row.length - 1) {\n",
       "                        let nextData = row[j + 1]\n",
       "                        if (nextData.leftBd) cell.rightBd = true\n",
       "                        else if (cell.rightBd) nextData.leftBd = true\n",
       "                    } else cell.rightBd = false\n",
       "                }\n",
       "            }\n",
       "            return result\n",
       "        }\n",
       "\n",
       "        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n",
       "            if (result.length === depth) {\n",
       "                const array = [];\n",
       "                if (pos &gt; 0) {\n",
       "                    let j = 0\n",
       "                    for (let i = 0; j &lt; pos; i++) {\n",
       "                        let c = result[depth - 1][i]\n",
       "                        j += c.span\n",
       "                        let copy = Object.assign({empty: true}, c)\n",
       "                        array.push(copy)\n",
       "                    }\n",
       "                }\n",
       "                result.push(array)\n",
       "            }\n",
       "            const col = cols[colId];\n",
       "            let size = 0;\n",
       "            if (col.expanded) {\n",
       "                let childPos = pos\n",
       "                for (let i = 0; i &lt; col.children.length; i++) {\n",
       "                    let child = col.children[i]\n",
       "                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n",
       "                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n",
       "                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n",
       "                    childPos += childSize\n",
       "                    size += childSize\n",
       "                }\n",
       "            } else {\n",
       "                for (let i = depth + 1; i &lt; result.length; i++)\n",
       "                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n",
       "                size = 1\n",
       "            }\n",
       "            let left = leftBorder\n",
       "            let right = rightBorder\n",
       "            if (size &gt; 1) {\n",
       "                left = true\n",
       "                right = true\n",
       "            }\n",
       "            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n",
       "            return size\n",
       "        }\n",
       "\n",
       "        this.getTableElement = function (id) {\n",
       "            return document.getElementById(&quot;df_&quot; + id)\n",
       "        }\n",
       "\n",
       "        this.getTableData = function (id) {\n",
       "            return this.getTableElement(id).df\n",
       "        }\n",
       "\n",
       "        this.createExpander = function (isExpanded) {\n",
       "            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n",
       "            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n",
       "            svg.classList.add(&quot;expanderSvg&quot;)\n",
       "            let path = document.createElementNS(svgNs, &quot;path&quot;)\n",
       "            if (isExpanded) {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n",
       "            } else {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n",
       "            }\n",
       "            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n",
       "            svg.appendChild(path)\n",
       "            return svg\n",
       "        }\n",
       "\n",
       "        this.renderTable = function (id) {\n",
       "\n",
       "            let table = this.getTableElement(id)\n",
       "\n",
       "            if (table === null) return\n",
       "\n",
       "            table.innerHTML = &quot;&quot;\n",
       "\n",
       "            let df = table.df\n",
       "            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n",
       "\n",
       "            &sol;&sol; header\n",
       "            let header = document.createElement(&quot;thead&quot;)\n",
       "            table.appendChild(header)\n",
       "\n",
       "            let renderData = this.computeRenderData(df)\n",
       "            for (let j = 0; j &lt; renderData.length; j++) {\n",
       "                let rowData = renderData[j]\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                let isLastRow = j === renderData.length - 1\n",
       "                header.appendChild(tr);\n",
       "                for (let i = 0; i &lt; rowData.length; i++) {\n",
       "                    let cell = rowData[i]\n",
       "                    let th = document.createElement(&quot;th&quot;);\n",
       "                    th.setAttribute(&quot;colspan&quot;, cell.span)\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId];\n",
       "                    if (!cell.empty) {\n",
       "                        if (col.children.length === 0) {\n",
       "                            th.innerHTML = col.name\n",
       "                        } else {\n",
       "                            let link = document.createElement(&quot;a&quot;)\n",
       "                            link.className = &quot;expander&quot;\n",
       "                            let that = this\n",
       "                            link.onclick = function () {\n",
       "                                col.expanded = !col.expanded\n",
       "                                that.renderTable(id)\n",
       "                            }\n",
       "                            link.appendChild(this.createExpander(col.expanded))\n",
       "                            link.innerHTML += col.name\n",
       "                            th.appendChild(link)\n",
       "                        }\n",
       "                    }\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (isLastRow)\n",
       "                        classes += &quot; bottomBorder&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        th.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(th)\n",
       "                }\n",
       "            }\n",
       "\n",
       "            &sol;&sol; body\n",
       "            let body = document.createElement(&quot;tbody&quot;)\n",
       "            table.appendChild(body)\n",
       "\n",
       "            let columns = renderData.pop()\n",
       "            for (let row = 0; row &lt; df.nrow; row++) {\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                body.appendChild(tr)\n",
       "                for (let i = 0; i &lt; columns.length; i++) {\n",
       "                    let cell = columns[i]\n",
       "                    let td = document.createElement(&quot;td&quot;);\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId]\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        td.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(td)\n",
       "                    let value = col.values[row]\n",
       "                    if (value.frameId !== undefined) {\n",
       "                        let frameId = value.frameId\n",
       "                        let expanded = rootDf.expandedFrames.has(frameId)\n",
       "                        let link = document.createElement(&quot;a&quot;)\n",
       "                        link.className = &quot;expander&quot;\n",
       "                        let that = this\n",
       "                        link.onclick = function () {\n",
       "                            if (rootDf.expandedFrames.has(frameId))\n",
       "                                rootDf.expandedFrames.delete(frameId)\n",
       "                            else rootDf.expandedFrames.add(frameId)\n",
       "                            that.renderTable(id)\n",
       "                        }\n",
       "                        link.appendChild(this.createExpander(expanded))\n",
       "                        link.innerHTML += value.value\n",
       "                        if (expanded) {\n",
       "                            td.appendChild(link)\n",
       "                            td.appendChild(document.createElement(&quot;p&quot;))\n",
       "                            const childTable = document.createElement(&quot;table&quot;)\n",
       "                            childTable.className = &quot;dataframe&quot;\n",
       "                            childTable.id = &quot;df_&quot; + frameId\n",
       "                            let childDf = rootDf.childFrames[frameId]\n",
       "                            childTable.df = childDf\n",
       "                            td.appendChild(childTable)\n",
       "                            this.renderTable(frameId)\n",
       "                            if (childDf.nrow !== childDf.totalRows) {\n",
       "                                const footer = document.createElement(&quot;p&quot;)\n",
       "                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n",
       "                                td.appendChild(footer)\n",
       "                            }\n",
       "                        } else {\n",
       "                            td.appendChild(link)\n",
       "                        }\n",
       "                    } else if (value.style !== undefined) {\n",
       "                        td.innerHTML = value.value\n",
       "                        td.setAttribute(&quot;style&quot;, value.style)\n",
       "                    } else td.innerHTML = value\n",
       "                    this.nodeScriptReplace(td)\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.nodeScriptReplace = function (node) {\n",
       "            if (this.nodeScriptIs(node) === true) {\n",
       "                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n",
       "            } else {\n",
       "                let i = -1, children = node.childNodes;\n",
       "                while (++i &lt; children.length) {\n",
       "                    this.nodeScriptReplace(children[i]);\n",
       "                }\n",
       "            }\n",
       "\n",
       "            return node;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptClone = function (node) {\n",
       "            let script = document.createElement(&quot;script&quot;);\n",
       "            script.text = node.innerHTML;\n",
       "\n",
       "            let i = -1, attrs = node.attributes, attr;\n",
       "            while (++i &lt; attrs.length) {\n",
       "                script.setAttribute((attr = attrs[i]).name, attr.value);\n",
       "            }\n",
       "            return script;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptIs = function (node) {\n",
       "            return node.tagName === 'SCRIPT';\n",
       "        }\n",
       "    })()\n",
       "\n",
       "    window.call_DataFrame = function (f) {\n",
       "        return f();\n",
       "    };\n",
       "\n",
       "    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n",
       "    if (funQueue) {\n",
       "        funQueue.forEach(function (f) {\n",
       "            f();\n",
       "        });\n",
       "        funQueue = [];\n",
       "    }\n",
       "})()\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;full_name: String&bsol;&quot;&gt;full_name&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;JetBrains&sol;kotlin&quot;,&quot;JetBrains&sol;intellij-community&quot;,&quot;JetBrains&sol;kotlin-native&quot;,&quot;JetBrains&sol;compose-jb&quot;,&quot;JetBrains&sol;ideavim&quot;,&quot;JetBrains&sol;JetBrainsMono&quot;,&quot;JetBrains&sol;Exposed&quot;,&quot;JetBrains&sol;ring-ui&quot;,&quot;JetBrains&sol;kotlinconf-app&quot;,&quot;JetBrains&sol;create-react-kotlin-app&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;html_url: URL&bsol;&quot;&gt;html_url&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;kotlin' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;kotlin&lt;&sol;a&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;https:&sol;&sol;github.com&sol;JetBrains&sol;intellij-community&bsol;&quot;&gt;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;intellij-community' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;intellij&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;a&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;https:&sol;&sol;github.com&sol;JetBrains&sol;kotlin-native&bsol;&quot;&gt;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;kotlin-native' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;kotlin-n&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;a&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;compose-jb' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;compose-jb&lt;&sol;a&gt;&quot;,&quot;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;ideavim' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;ideavim&lt;&sol;a&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;https:&sol;&sol;github.com&sol;JetBrains&sol;JetBrainsMono&bsol;&quot;&gt;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;JetBrainsMono' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;JetBrain&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;a&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;Exposed' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;Exposed&lt;&sol;a&gt;&quot;,&quot;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;ring-ui' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;ring-ui&lt;&sol;a&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;https:&sol;&sol;github.com&sol;JetBrains&sol;kotlinconf-app&bsol;&quot;&gt;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;kotlinconf-app' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;kotlinco&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;a&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;https:&sol;&sol;github.com&sol;JetBrains&sol;create-react-kotlin-app&bsol;&quot;&gt;&lt;a href='https:&sol;&sol;github.com&sol;JetBrains&sol;create-react-kotlin-app' target='_blank'&gt;https:&sol;&sol;github.com&sol;JetBrains&sol;create-r&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;a&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;stargazers_count: Int&bsol;&quot;&gt;stargazers_count&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;39402&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;12926&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;7101&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;6805&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;6120&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;6059&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;5688&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;2836&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;2628&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;2424&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;topics: String&bsol;&quot;&gt;topics&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[compiler, gradle-plugin, intellij-plugin, kotlin, kotlin-library, maven-plugin, programming-language]&bsol;&quot;&gt;[compiler, gradle-plugin, intellij-pl&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[code-editor, ide, intellij, intellij-community, intellij-platform]&bsol;&quot;&gt;[code-editor, ide, intellij, intellij&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;[c, compiler, kotlin, llvm, objective-c]&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[android, awt, compose, declarative-ui, desktop, gui, javascript, kotlin, multiplatform, reactive, swing, ui]&bsol;&quot;&gt;[android, awt, compose, declarative-u&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[ideavim, intellij, intellij-platform, jb-official, kotlin, vim, vim-emulator]&bsol;&quot;&gt;[ideavim, intellij, intellij-platform&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[coding-font, font, ligatures, monospaced-font, programming-font, programming-ligatures]&bsol;&quot;&gt;[coding-font, font, ligatures, monosp&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;[dao, kotlin, orm, sql]&quot;,&quot;[components, jetbrains-ui, react]&quot;,&quot;[]&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[create-react-app, jetbrains-ui, kotlin, react, webpack]&bsol;&quot;&gt;[create-react-app, jetbrains-ui, kotl&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;watchers: Int?&bsol;&quot;&gt;watchers&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;null&bsol;&quot;&gt;null&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;null&bsol;&quot;&gt;null&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;null&bsol;&quot;&gt;null&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;null&bsol;&quot;&gt;null&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;null&bsol;&quot;&gt;null&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;null&bsol;&quot;&gt;null&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;null&bsol;&quot;&gt;null&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;null&bsol;&quot;&gt;null&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;null&bsol;&quot;&gt;null&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;null&bsol;&quot;&gt;null&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "], id: 352321540, rootId: 352321540, totalRows: 10 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "call_DataFrame(function() { DataFrame.renderTable(352321540) });\n",
       "\n",
       "\n",
       "        &lt;&sol;script&gt;\n",
       "        &lt;&sol;html&gt;\"></iframe>\n",
       "            <script>\n",
       "                function o_resize_iframe_out_3() {\n",
       "                    let elem = document.getElementById(\"iframe_out_3\");\n",
       "                    resize_iframe_out_3(elem);\n",
       "                    setInterval(resize_iframe_out_3, 5000, elem);\n",
       "                }\n",
       "                function resize_iframe_out_3(el) {\n",
       "                    let h = el.contentWindow.document.body.scrollHeight;\n",
       "                    el.height = h === 0 ? 0 : h + 41;\n",
       "                }\n",
       "            </script>        <html theme='dark'>\n",
       "        <head>\n",
       "            <style type=\"text/css\">\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover > td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "/* formatting */\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       "            </style>\n",
       "        </head>\n",
       "        <body>\n",
       "            <table class=\"dataframe\" id=\"static_df_352321541\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">full_name</th><th class=\"bottomBorder\" style=\"text-align:left\">html_url</th><th class=\"bottomBorder\" style=\"text-align:left\">stargazers_count</th><th class=\"bottomBorder\" style=\"text-align:left\">topics</th><th class=\"bottomBorder\" style=\"text-align:left\">watchers</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\">JetBrains/kotlin</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/kotlin</td><td  style=\"vertical-align:top\">39402</td><td  style=\"vertical-align:top\">[compiler, gradle-plugin, intellij-pl<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">null</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/intellij-community</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/intellij<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">12926</td><td  style=\"vertical-align:top\">[code-editor, ide, intellij, intellij<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">null</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/kotlin-native</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/kotlin-n<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">7101</td><td  style=\"vertical-align:top\">[c, compiler, kotlin, llvm, objective-c]</td><td  style=\"vertical-align:top\">null</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/compose-jb</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/compose-jb</td><td  style=\"vertical-align:top\">6805</td><td  style=\"vertical-align:top\">[android, awt, compose, declarative-u<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">null</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/ideavim</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/ideavim</td><td  style=\"vertical-align:top\">6120</td><td  style=\"vertical-align:top\">[ideavim, intellij, intellij-platform<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">null</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/JetBrainsMono</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/JetBrain<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">6059</td><td  style=\"vertical-align:top\">[coding-font, font, ligatures, monosp<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">null</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/Exposed</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/Exposed</td><td  style=\"vertical-align:top\">5688</td><td  style=\"vertical-align:top\">[dao, kotlin, orm, sql]</td><td  style=\"vertical-align:top\">null</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/ring-ui</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/ring-ui</td><td  style=\"vertical-align:top\">2836</td><td  style=\"vertical-align:top\">[components, jetbrains-ui, react]</td><td  style=\"vertical-align:top\">null</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/kotlinconf-app</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/kotlinco<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">2628</td><td  style=\"vertical-align:top\">[]</td><td  style=\"vertical-align:top\">null</td></tr><tr><td  style=\"vertical-align:top\">JetBrains/create-react-kotlin-app</td><td  style=\"vertical-align:top\">https://github.com/JetBrains/create-r<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">2424</td><td  style=\"vertical-align:top\">[create-react-app, jetbrains-ui, kotl<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">null</td></tr></tbody></table>\n",
       "        </body>\n",
       "        <script>\n",
       "            document.getElementById(\"static_df_352321541\").style.display = \"none\";\n",
       "        </script>\n",
       "        </html>"
      ],
      "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"full_name\",\"html_url\",\"stargazers_count\",\"topics\",\"watchers\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"java.net.URL\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int?\"}],\"nrow\":10,\"ncol\":5},\"kotlin_dataframe\":[{\"full_name\":\"JetBrains/kotlin\",\"html_url\":\"https://github.com/JetBrains/kotlin\",\"stargazers_count\":39402,\"topics\":\"[compiler, gradle-plugin, intellij-plugin, kotlin, kotlin-library, maven-plugin, programming-language]\",\"watchers\":null},{\"full_name\":\"JetBrains/intellij-community\",\"html_url\":\"https://github.com/JetBrains/intellij-community\",\"stargazers_count\":12926,\"topics\":\"[code-editor, ide, intellij, intellij-community, intellij-platform]\",\"watchers\":null},{\"full_name\":\"JetBrains/kotlin-native\",\"html_url\":\"https://github.com/JetBrains/kotlin-native\",\"stargazers_count\":7101,\"topics\":\"[c, compiler, kotlin, llvm, objective-c]\",\"watchers\":null},{\"full_name\":\"JetBrains/compose-jb\",\"html_url\":\"https://github.com/JetBrains/compose-jb\",\"stargazers_count\":6805,\"topics\":\"[android, awt, compose, declarative-ui, desktop, gui, javascript, kotlin, multiplatform, reactive, swing, ui]\",\"watchers\":null},{\"full_name\":\"JetBrains/ideavim\",\"html_url\":\"https://github.com/JetBrains/ideavim\",\"stargazers_count\":6120,\"topics\":\"[ideavim, intellij, intellij-platform, jb-official, kotlin, vim, vim-emulator]\",\"watchers\":null},{\"full_name\":\"JetBrains/JetBrainsMono\",\"html_url\":\"https://github.com/JetBrains/JetBrainsMono\",\"stargazers_count\":6059,\"topics\":\"[coding-font, font, ligatures, monospaced-font, programming-font, programming-ligatures]\",\"watchers\":null},{\"full_name\":\"JetBrains/Exposed\",\"html_url\":\"https://github.com/JetBrains/Exposed\",\"stargazers_count\":5688,\"topics\":\"[dao, kotlin, orm, sql]\",\"watchers\":null},{\"full_name\":\"JetBrains/ring-ui\",\"html_url\":\"https://github.com/JetBrains/ring-ui\",\"stargazers_count\":2836,\"topics\":\"[components, jetbrains-ui, react]\",\"watchers\":null},{\"full_name\":\"JetBrains/kotlinconf-app\",\"html_url\":\"https://github.com/JetBrains/kotlinconf-app\",\"stargazers_count\":2628,\"topics\":\"[]\",\"watchers\":null},{\"full_name\":\"JetBrains/create-react-kotlin-app\",\"html_url\":\"https://github.com/JetBrains/create-react-kotlin-app\",\"stargazers_count\":2424,\"topics\":\"[create-react-app, jetbrains-ui, kotlin, react, webpack]\",\"watchers\":null}]}"
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:46.248920Z",
     "start_time": "2025-05-28T11:14:45.913363Z"
    }
   },
   "cell_type": "code",
   "source": [
    "// If types of columns that function uses don't match and verify = false, expect NPE and ClassCast exceptions\n",
    "fun AnyFrame.filter_noVerify() = castTo(sample, verify = false).filter { watchers > 10 }.take(10)\n",
    "\n",
    "// exception is expected here\n",
    "repos.update { watchers }.withNull().filter_noVerify()"
   ],
   "outputs": [
    {
     "ename": "java.lang.NullPointerException",
     "evalue": "null cannot be cast to non-null type kotlin.Int",
     "output_type": "error",
     "traceback": [
      "java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Int",
      "\tat Line_14_jupyter._DataFrameType_watchers(Line_14.jupyter.kts:13) at Cell In[0], line 13",
      "\tat Line_21_jupyter$filter_noVerify$1.invoke(Line_21.jupyter.kts:2) at Cell In[6], line 2",
      "\tat Line_21_jupyter$filter_noVerify$1.invoke(Line_21.jupyter.kts:2) at Cell In[6], line 2",
      "\tat org.jetbrains.kotlinx.dataframe.api.FilterKt.filter(filter.kt:39)",
      "\tat Line_21_jupyter.filter_noVerify(Line_21.jupyter.kts:2) at Cell In[6], line 2",
      "\tat Line_21_jupyter.<init>(Line_21.jupyter.kts:5) at Cell In[6], line 5",
      "\tat java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)",
      "\tat java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)",
      "\tat java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)",
      "\tat java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)",
      "\tat kotlin.script.experimental.jvm.BasicJvmScriptEvaluator.evalWithConfigAndOtherScriptsResults(BasicJvmScriptEvaluator.kt:122)",
      "\tat kotlin.script.experimental.jvm.BasicJvmScriptEvaluator.invoke$suspendImpl(BasicJvmScriptEvaluator.kt:48)",
      "\tat kotlin.script.experimental.jvm.BasicJvmScriptEvaluator.invoke(BasicJvmScriptEvaluator.kt)",
      "\tat kotlin.script.experimental.jvm.BasicJvmReplEvaluator.eval(BasicJvmReplEvaluator.kt:49)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.InternalEvaluatorImpl$eval$resultWithDiagnostics$1.invokeSuspend(InternalEvaluatorImpl.kt:137)",
      "\tat kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)",
      "\tat kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)",
      "\tat kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:277)",
      "\tat kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:95)",
      "\tat kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:69)",
      "\tat kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)",
      "\tat kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:48)",
      "\tat kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.InternalEvaluatorImpl.eval(InternalEvaluatorImpl.kt:137)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.CellExecutorImpl$execute$1$result$1.invoke(CellExecutorImpl.kt:80)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.CellExecutorImpl$execute$1$result$1.invoke(CellExecutorImpl.kt:78)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.ReplForJupyterImpl.withHost(ReplForJupyterImpl.kt:779)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.CellExecutorImpl.execute-L4Nmkdk(CellExecutorImpl.kt:78)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.execution.CellExecutor$DefaultImpls.execute-L4Nmkdk$default(CellExecutor.kt:13)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.ReplForJupyterImpl.evaluateUserCode-wNURfNM(ReplForJupyterImpl.kt:601)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.ReplForJupyterImpl.evalExImpl(ReplForJupyterImpl.kt:459)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.ReplForJupyterImpl.access$evalExImpl(ReplForJupyterImpl.kt:140)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.ReplForJupyterImpl$evalEx$1.invoke(ReplForJupyterImpl.kt:452)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.ReplForJupyterImpl$evalEx$1.invoke(ReplForJupyterImpl.kt:451)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.ReplForJupyterImpl.withEvalContext(ReplForJupyterImpl.kt:432)",
      "\tat org.jetbrains.kotlinx.jupyter.repl.impl.ReplForJupyterImpl.evalEx(ReplForJupyterImpl.kt:451)",
      "\tat org.jetbrains.kotlinx.jupyter.messaging.IdeCompatibleMessageRequestProcessor$processExecuteRequest$1$response$1$1.invoke(IdeCompatibleMessageRequestProcessor.kt:160)",
      "\tat org.jetbrains.kotlinx.jupyter.messaging.IdeCompatibleMessageRequestProcessor$processExecuteRequest$1$response$1$1.invoke(IdeCompatibleMessageRequestProcessor.kt:159)",
      "\tat org.jetbrains.kotlinx.jupyter.streams.BlockingSubstitutionEngine.withDataSubstitution(SubstitutionEngine.kt:70)",
      "\tat org.jetbrains.kotlinx.jupyter.streams.StreamSubstitutionManager.withSubstitutedStreams(StreamSubstitutionManager.kt:118)",
      "\tat org.jetbrains.kotlinx.jupyter.messaging.IdeCompatibleMessageRequestProcessor.withForkedIn(IdeCompatibleMessageRequestProcessor.kt:355)",
      "\tat org.jetbrains.kotlinx.jupyter.messaging.IdeCompatibleMessageRequestProcessor.access$withForkedIn(IdeCompatibleMessageRequestProcessor.kt:55)",
      "\tat org.jetbrains.kotlinx.jupyter.messaging.IdeCompatibleMessageRequestProcessor$evalWithIO$1$1.invoke(IdeCompatibleMessageRequestProcessor.kt:369)",
      "\tat org.jetbrains.kotlinx.jupyter.streams.BlockingSubstitutionEngine.withDataSubstitution(SubstitutionEngine.kt:70)",
      "\tat org.jetbrains.kotlinx.jupyter.streams.StreamSubstitutionManager.withSubstitutedStreams(StreamSubstitutionManager.kt:118)",
      "\tat org.jetbrains.kotlinx.jupyter.messaging.IdeCompatibleMessageRequestProcessor.withForkedErr(IdeCompatibleMessageRequestProcessor.kt:344)",
      "\tat org.jetbrains.kotlinx.jupyter.messaging.IdeCompatibleMessageRequestProcessor.access$withForkedErr(IdeCompatibleMessageRequestProcessor.kt:55)",
      "\tat org.jetbrains.kotlinx.jupyter.messaging.IdeCompatibleMessageRequestProcessor$evalWithIO$1.invoke(IdeCompatibleMessageRequestProcessor.kt:368)",
      "\tat org.jetbrains.kotlinx.jupyter.streams.BlockingSubstitutionEngine.withDataSubstitution(SubstitutionEngine.kt:70)",
      "\tat org.jetbrains.kotlinx.jupyter.streams.StreamSubstitutionManager.withSubstitutedStreams(StreamSubstitutionManager.kt:118)",
      "\tat org.jetbrains.kotlinx.jupyter.messaging.IdeCompatibleMessageRequestProcessor.withForkedOut(IdeCompatibleMessageRequestProcessor.kt:336)",
      "\tat org.jetbrains.kotlinx.jupyter.messaging.IdeCompatibleMessageRequestProcessor.evalWithIO(IdeCompatibleMessageRequestProcessor.kt:367)",
      "\tat org.jetbrains.kotlinx.jupyter.messaging.IdeCompatibleMessageRequestProcessor$processExecuteRequest$1$response$1.invoke(IdeCompatibleMessageRequestProcessor.kt:159)",
      "\tat org.jetbrains.kotlinx.jupyter.messaging.IdeCompatibleMessageRequestProcessor$processExecuteRequest$1$response$1.invoke(IdeCompatibleMessageRequestProcessor.kt:158)",
      "\tat org.jetbrains.kotlinx.jupyter.execution.JupyterExecutorImpl$Task.execute(JupyterExecutorImpl.kt:41)",
      "\tat org.jetbrains.kotlinx.jupyter.execution.JupyterExecutorImpl$executorThread$1.invoke(JupyterExecutorImpl.kt:83)",
      "\tat org.jetbrains.kotlinx.jupyter.execution.JupyterExecutorImpl$executorThread$1.invoke(JupyterExecutorImpl.kt:80)",
      "\tat kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)",
      "",
      "java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Int",
      "at Cell In[0], line 13",
      ""
     ]
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## generateDataClasses\n",
    "[Issue 344](https://github.com/Kotlin/dataframe/issues/344) \n",
    "\n",
    "[PR 763](https://github.com/Kotlin/dataframe/pull/763)\n",
    "\n",
    "This new function can generate data class declarations that match DataFrame schema, including FrameColumn and ColumnGroup"
   ]
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:46.932609Z",
     "start_time": "2025-05-28T11:14:46.261669Z"
    }
   },
   "cell_type": "code",
   "source": [
    "val repos1 = repos.groupBy { expr(\"thousands\") { stargazers_count / 1000 } }.toDataFrame()\n",
    "repos1.schema()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "thousands: Int\n",
       "group: *\n",
       "    full_name: String\n",
       "    html_url: URL\n",
       "    stargazers_count: Int\n",
       "    topics: String\n",
       "    watchers: Int\n"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:47.066606Z",
     "start_time": "2025-05-28T11:14:46.937356Z"
    }
   },
   "cell_type": "code",
   "source": "repos1.generateDataClasses(markerName = \"RepositoriesData\")",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "@DataSchema\n",
       "data class RepositoriesData1(\n",
       "    @ColumnName(\"full_name\")\n",
       "    val fullName: String,\n",
       "    @ColumnName(\"html_url\")\n",
       "    val htmlUrl: java.net.URL,\n",
       "    @ColumnName(\"stargazers_count\")\n",
       "    val stargazersCount: Int,\n",
       "    val topics: String,\n",
       "    val watchers: Int\n",
       ")\n",
       "\n",
       "@DataSchema\n",
       "data class RepositoriesData(\n",
       "    val group: List<RepositoriesData1>,\n",
       "    val thousands: Int\n",
       ")"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:48.692875Z",
     "start_time": "2025-05-28T11:14:47.072896Z"
    }
   },
   "cell_type": "code",
   "source": [
    "// There's no need to copy-paste generated code into the notebook. It can be executed:\n",
    "EXECUTE(repos1.generateDataClasses(markerName = \"RepositoriesData\").value)"
   ],
   "outputs": [],
   "execution_count": 9
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "A dataframe can then be converted to these data classes"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:48.981704Z",
     "start_time": "2025-05-28T11:14:48.699879Z"
    }
   },
   "cell_type": "code",
   "source": [
    "val repositoriesDataList = repos1.toListOf<RepositoriesData>()\n",
    "repositoriesDataList.forEach { \n",
    "    println(it.thousands)\n",
    "}"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "6\n",
      "1\n",
      "12\n",
      "39\n",
      "5\n",
      "7\n",
      "2\n"
     ]
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "A list of data class instances can be converted to DataFrame too"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:49.403316Z",
     "start_time": "2025-05-28T11:14:48.984852Z"
    }
   },
   "cell_type": "code",
   "source": [
    "val dataframe = RepositoriesData1(\n",
    "    \"Kotlin/dataframe\",\n",
    "    URL(\"https://github.com/Kotlin/dataframe\"),\n",
    "    stargazersCount = 773,\n",
    "    topics = \"[kotlin, data-science, data-analysis, dataframe]\",\n",
    "    watchers = 16\n",
    ")\n",
    "val repos2 = listOf(RepositoriesData(listOf(dataframe), 0)).toDataFrame()\n",
    "repos2"
   ],
   "outputs": [
    {
     "data": {
      "text/html": [
       "            <iframe onload=\"o_resize_iframe_out_4()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_4\" frameBorder=\"0\" srcdoc=\"        &lt;html theme='dark'&gt;\n",
       "        &lt;head&gt;\n",
       "            &lt;style type=&quot;text&sol;css&quot;&gt;\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover &gt; td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "&sol;* formatting *&sol;\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       ":root {\n",
       "    --scroll-bg: #f5f5f5;\n",
       "    --scroll-fg: #b3b3b3;\n",
       "}\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n",
       "    --scroll-bg: #3c3c3c;\n",
       "    --scroll-fg: #97e1fb;\n",
       "}\n",
       "body {\n",
       "    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n",
       "}\n",
       "body::-webkit-scrollbar {\n",
       "    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n",
       "    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n",
       "}\n",
       "body::-webkit-scrollbar-thumb {\n",
       "    background-color: var(--scroll-fg);\n",
       "}\n",
       "body::-webkit-scrollbar-track {\n",
       "    background-color: var(--scroll-bg);\n",
       "}\n",
       "            &lt;&sol;style&gt;\n",
       "        &lt;&sol;head&gt;\n",
       "        &lt;body&gt;\n",
       "            &lt;table class=&quot;dataframe&quot; id=&quot;df_352321542&quot;&gt;&lt;&sol;table&gt;\n",
       "\n",
       "&lt;p class=&quot;dataframe_description&quot;&gt;DataFrame: rowsCount = 1, columnsCount = 2&lt;&sol;p&gt;\n",
       "\n",
       "        &lt;&sol;body&gt;\n",
       "        &lt;script&gt;\n",
       "            (function () {\n",
       "    window.DataFrame = window.DataFrame || new (function () {\n",
       "        this.addTable = function (df) {\n",
       "            let cols = df.cols;\n",
       "            for (let i = 0; i &lt; cols.length; i++) {\n",
       "                for (let c of cols[i].children) {\n",
       "                    cols[c].parent = i;\n",
       "                }\n",
       "            }\n",
       "            df.nrow = 0\n",
       "            for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n",
       "            }\n",
       "            if (df.id === df.rootId) {\n",
       "                df.expandedFrames = new Set()\n",
       "                df.childFrames = {}\n",
       "                const table = this.getTableElement(df.id)\n",
       "                table.df = df\n",
       "                for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                    let col = df.cols[i]\n",
       "                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n",
       "                }\n",
       "            } else {\n",
       "                const rootDf = this.getTableData(df.rootId)\n",
       "                rootDf.childFrames[df.id] = df\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.computeRenderData = function (df) {\n",
       "            let result = []\n",
       "            let pos = 0\n",
       "            for (let col = 0; col &lt; df.cols.length; col++) {\n",
       "                if (df.cols[col].parent === undefined)\n",
       "                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n",
       "            }\n",
       "            for (let i = 0; i &lt; result.length; i++) {\n",
       "                let row = result[i]\n",
       "                for (let j = 0; j &lt; row.length; j++) {\n",
       "                    let cell = row[j]\n",
       "                    if (j === 0)\n",
       "                        cell.leftBd = false\n",
       "                    if (j &lt; row.length - 1) {\n",
       "                        let nextData = row[j + 1]\n",
       "                        if (nextData.leftBd) cell.rightBd = true\n",
       "                        else if (cell.rightBd) nextData.leftBd = true\n",
       "                    } else cell.rightBd = false\n",
       "                }\n",
       "            }\n",
       "            return result\n",
       "        }\n",
       "\n",
       "        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n",
       "            if (result.length === depth) {\n",
       "                const array = [];\n",
       "                if (pos &gt; 0) {\n",
       "                    let j = 0\n",
       "                    for (let i = 0; j &lt; pos; i++) {\n",
       "                        let c = result[depth - 1][i]\n",
       "                        j += c.span\n",
       "                        let copy = Object.assign({empty: true}, c)\n",
       "                        array.push(copy)\n",
       "                    }\n",
       "                }\n",
       "                result.push(array)\n",
       "            }\n",
       "            const col = cols[colId];\n",
       "            let size = 0;\n",
       "            if (col.expanded) {\n",
       "                let childPos = pos\n",
       "                for (let i = 0; i &lt; col.children.length; i++) {\n",
       "                    let child = col.children[i]\n",
       "                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n",
       "                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n",
       "                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n",
       "                    childPos += childSize\n",
       "                    size += childSize\n",
       "                }\n",
       "            } else {\n",
       "                for (let i = depth + 1; i &lt; result.length; i++)\n",
       "                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n",
       "                size = 1\n",
       "            }\n",
       "            let left = leftBorder\n",
       "            let right = rightBorder\n",
       "            if (size &gt; 1) {\n",
       "                left = true\n",
       "                right = true\n",
       "            }\n",
       "            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n",
       "            return size\n",
       "        }\n",
       "\n",
       "        this.getTableElement = function (id) {\n",
       "            return document.getElementById(&quot;df_&quot; + id)\n",
       "        }\n",
       "\n",
       "        this.getTableData = function (id) {\n",
       "            return this.getTableElement(id).df\n",
       "        }\n",
       "\n",
       "        this.createExpander = function (isExpanded) {\n",
       "            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n",
       "            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n",
       "            svg.classList.add(&quot;expanderSvg&quot;)\n",
       "            let path = document.createElementNS(svgNs, &quot;path&quot;)\n",
       "            if (isExpanded) {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n",
       "            } else {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n",
       "            }\n",
       "            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n",
       "            svg.appendChild(path)\n",
       "            return svg\n",
       "        }\n",
       "\n",
       "        this.renderTable = function (id) {\n",
       "\n",
       "            let table = this.getTableElement(id)\n",
       "\n",
       "            if (table === null) return\n",
       "\n",
       "            table.innerHTML = &quot;&quot;\n",
       "\n",
       "            let df = table.df\n",
       "            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n",
       "\n",
       "            &sol;&sol; header\n",
       "            let header = document.createElement(&quot;thead&quot;)\n",
       "            table.appendChild(header)\n",
       "\n",
       "            let renderData = this.computeRenderData(df)\n",
       "            for (let j = 0; j &lt; renderData.length; j++) {\n",
       "                let rowData = renderData[j]\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                let isLastRow = j === renderData.length - 1\n",
       "                header.appendChild(tr);\n",
       "                for (let i = 0; i &lt; rowData.length; i++) {\n",
       "                    let cell = rowData[i]\n",
       "                    let th = document.createElement(&quot;th&quot;);\n",
       "                    th.setAttribute(&quot;colspan&quot;, cell.span)\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId];\n",
       "                    if (!cell.empty) {\n",
       "                        if (col.children.length === 0) {\n",
       "                            th.innerHTML = col.name\n",
       "                        } else {\n",
       "                            let link = document.createElement(&quot;a&quot;)\n",
       "                            link.className = &quot;expander&quot;\n",
       "                            let that = this\n",
       "                            link.onclick = function () {\n",
       "                                col.expanded = !col.expanded\n",
       "                                that.renderTable(id)\n",
       "                            }\n",
       "                            link.appendChild(this.createExpander(col.expanded))\n",
       "                            link.innerHTML += col.name\n",
       "                            th.appendChild(link)\n",
       "                        }\n",
       "                    }\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (isLastRow)\n",
       "                        classes += &quot; bottomBorder&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        th.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(th)\n",
       "                }\n",
       "            }\n",
       "\n",
       "            &sol;&sol; body\n",
       "            let body = document.createElement(&quot;tbody&quot;)\n",
       "            table.appendChild(body)\n",
       "\n",
       "            let columns = renderData.pop()\n",
       "            for (let row = 0; row &lt; df.nrow; row++) {\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                body.appendChild(tr)\n",
       "                for (let i = 0; i &lt; columns.length; i++) {\n",
       "                    let cell = columns[i]\n",
       "                    let td = document.createElement(&quot;td&quot;);\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId]\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        td.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(td)\n",
       "                    let value = col.values[row]\n",
       "                    if (value.frameId !== undefined) {\n",
       "                        let frameId = value.frameId\n",
       "                        let expanded = rootDf.expandedFrames.has(frameId)\n",
       "                        let link = document.createElement(&quot;a&quot;)\n",
       "                        link.className = &quot;expander&quot;\n",
       "                        let that = this\n",
       "                        link.onclick = function () {\n",
       "                            if (rootDf.expandedFrames.has(frameId))\n",
       "                                rootDf.expandedFrames.delete(frameId)\n",
       "                            else rootDf.expandedFrames.add(frameId)\n",
       "                            that.renderTable(id)\n",
       "                        }\n",
       "                        link.appendChild(this.createExpander(expanded))\n",
       "                        link.innerHTML += value.value\n",
       "                        if (expanded) {\n",
       "                            td.appendChild(link)\n",
       "                            td.appendChild(document.createElement(&quot;p&quot;))\n",
       "                            const childTable = document.createElement(&quot;table&quot;)\n",
       "                            childTable.className = &quot;dataframe&quot;\n",
       "                            childTable.id = &quot;df_&quot; + frameId\n",
       "                            let childDf = rootDf.childFrames[frameId]\n",
       "                            childTable.df = childDf\n",
       "                            td.appendChild(childTable)\n",
       "                            this.renderTable(frameId)\n",
       "                            if (childDf.nrow !== childDf.totalRows) {\n",
       "                                const footer = document.createElement(&quot;p&quot;)\n",
       "                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n",
       "                                td.appendChild(footer)\n",
       "                            }\n",
       "                        } else {\n",
       "                            td.appendChild(link)\n",
       "                        }\n",
       "                    } else if (value.style !== undefined) {\n",
       "                        td.innerHTML = value.value\n",
       "                        td.setAttribute(&quot;style&quot;, value.style)\n",
       "                    } else td.innerHTML = value\n",
       "                    this.nodeScriptReplace(td)\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.nodeScriptReplace = function (node) {\n",
       "            if (this.nodeScriptIs(node) === true) {\n",
       "                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n",
       "            } else {\n",
       "                let i = -1, children = node.childNodes;\n",
       "                while (++i &lt; children.length) {\n",
       "                    this.nodeScriptReplace(children[i]);\n",
       "                }\n",
       "            }\n",
       "\n",
       "            return node;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptClone = function (node) {\n",
       "            let script = document.createElement(&quot;script&quot;);\n",
       "            script.text = node.innerHTML;\n",
       "\n",
       "            let i = -1, attrs = node.attributes, attr;\n",
       "            while (++i &lt; attrs.length) {\n",
       "                script.setAttribute((attr = attrs[i]).name, attr.value);\n",
       "            }\n",
       "            return script;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptIs = function (node) {\n",
       "            return node.tagName === 'SCRIPT';\n",
       "        }\n",
       "    })()\n",
       "\n",
       "    window.call_DataFrame = function (f) {\n",
       "        return f();\n",
       "    };\n",
       "\n",
       "    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n",
       "    if (funQueue) {\n",
       "        funQueue.forEach(function (f) {\n",
       "            f();\n",
       "        });\n",
       "        funQueue = [];\n",
       "    }\n",
       "})()\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;group: DataFrame&lt;*&gt;&bsol;&quot;&gt;group&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [{ frameId: 352321543, value: &quot;&lt;b&gt;DataFrame 1 x 5&lt;&sol;b&gt;&quot; }] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;thousands: Int&bsol;&quot;&gt;thousands&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;0&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "], id: 352321542, rootId: 352321542, totalRows: 1 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;topics: String&bsol;&quot;&gt;topics&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[kotlin, data-science, data-analysis, dataframe]&bsol;&quot;&gt;[kotlin, data-science, data-analysis,&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;watchers: Int&bsol;&quot;&gt;watchers&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;16&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;full_name: String&bsol;&quot;&gt;full_name&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;Kotlin&sol;dataframe&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;html_url: URL&bsol;&quot;&gt;html_url&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;&lt;a href='https:&sol;&sol;github.com&sol;Kotlin&sol;dataframe' target='_blank'&gt;https:&sol;&sol;github.com&sol;Kotlin&sol;dataframe&lt;&sol;a&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;stargazers_count: Int&bsol;&quot;&gt;stargazers_count&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;773&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "], id: 352321543, rootId: 352321542, totalRows: 1 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "call_DataFrame(function() { DataFrame.renderTable(352321542) });\n",
       "\n",
       "\n",
       "        &lt;&sol;script&gt;\n",
       "        &lt;&sol;html&gt;\"></iframe>\n",
       "            <script>\n",
       "                function o_resize_iframe_out_4() {\n",
       "                    let elem = document.getElementById(\"iframe_out_4\");\n",
       "                    resize_iframe_out_4(elem);\n",
       "                    setInterval(resize_iframe_out_4, 5000, elem);\n",
       "                }\n",
       "                function resize_iframe_out_4(el) {\n",
       "                    let h = el.contentWindow.document.body.scrollHeight;\n",
       "                    el.height = h === 0 ? 0 : h + 41;\n",
       "                }\n",
       "            </script>        <html theme='dark'>\n",
       "        <head>\n",
       "            <style type=\"text/css\">\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover > td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "/* formatting */\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       "            </style>\n",
       "        </head>\n",
       "        <body>\n",
       "            <table class=\"dataframe\" id=\"static_df_352321544\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">group</th><th class=\"bottomBorder\" style=\"text-align:left\">thousands</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\"><details><summary>DataFrame [1 x 5]</summary><table class=\"dataframe\" id=\"static_df_352321545\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">topics</th><th class=\"bottomBorder\" style=\"text-align:left\">watchers</th><th class=\"bottomBorder\" style=\"text-align:left\">full_name</th><th class=\"bottomBorder\" style=\"text-align:left\">html_url</th><th class=\"bottomBorder\" style=\"text-align:left\">stargazers_count</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\">[kotlin, data-science, data-analysis,<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">16</td><td  style=\"vertical-align:top\">Kotlin/dataframe</td><td  style=\"vertical-align:top\">https://github.com/Kotlin/dataframe</td><td  style=\"vertical-align:top\">773</td></tr></tbody></table></details></td><td  style=\"vertical-align:top\">0</td></tr></tbody></table>\n",
       "        </body>\n",
       "        <script>\n",
       "            document.getElementById(\"static_df_352321544\").style.display = \"none\";\n",
       "        </script>\n",
       "        </html>"
      ],
      "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"group\",\"thousands\"],\"types\":[{\"kind\":\"FrameColumn\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"}],\"nrow\":1,\"ncol\":2},\"kotlin_dataframe\":[{\"group\":{\"data\":[{\"topics\":\"[kotlin, data-science, data-analysis, dataframe]\",\"watchers\":16,\"full_name\":\"Kotlin/dataframe\",\"html_url\":\"https://github.com/Kotlin/dataframe\",\"stargazers_count\":773}],\"metadata\":{\"kind\":\"FrameColumn\",\"columns\":[\"topics\",\"watchers\",\"full_name\",\"html_url\",\"stargazers_count\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"java.net.URL\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"}],\"ncol\":5,\"nrow\":1}},\"thousands\":0}]}"
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:49.496868Z",
     "start_time": "2025-05-28T11:14:49.408094Z"
    }
   },
   "cell_type": "code",
   "source": [
    "repos2.schema() == repos1.schema()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "true"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 12
  },
  {
   "cell_type": "markdown",
   "source": [
    "## DataRowSchema API\n",
    "[Issue 113](https://github.com/Kotlin/dataframe/issues/113)\n",
    "\n",
    "We introduce a marker interface that data schema classes can implement. It will enable two new API: dataFrameOf and append.\n",
    "With the [compiler plugin](https://github.com/Kotlin/dataframe/issues/704), this interface will be automatically added to any declaration annotated with @DataSchema. For now let's see what it does:"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "source": [
    "@DataSchema\n",
    "data class RepositoriesData1(\n",
    "    @ColumnName(\"full_name\")\n",
    "    val fullName: String,\n",
    "    @ColumnName(\"html_url\")\n",
    "    val htmlUrl: java.net.URL,\n",
    "    @ColumnName(\"stargazers_count\")\n",
    "    val stargazersCount: Int,\n",
    "    val topics: String,\n",
    "    val watchers: Int\n",
    ")\n",
    "\n",
    "@DataSchema\n",
    "data class RepositoriesData(\n",
    "    val group: List<RepositoriesData1>,\n",
    "    val thousands: Int\n",
    ") : DataRowSchema // <<-- New marker interface "
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:50.380528Z",
     "start_time": "2025-05-28T11:14:49.499200Z"
    }
   },
   "outputs": [],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:50.926640Z",
     "start_time": "2025-05-28T11:14:50.388194Z"
    }
   },
   "cell_type": "code",
   "source": [
    "val element = RepositoriesData1(\n",
    "    \"Kotlin/dataframe\",\n",
    "    URL(\"https://github.com/Kotlin/dataframe\"),\n",
    "    stargazersCount = 773,\n",
    "    topics = \"[kotlin, data-science, data-analysis, dataframe]\",\n",
    "    watchers = 16\n",
    ")\n",
    "val df = dataFrameOf(RepositoriesData(listOf(element), 0)) // shorter compared to listOf().toDataFrame() above\n",
    "df.append(RepositoriesData(listOf(element), 0)) // new typed flavor of append"
   ],
   "outputs": [
    {
     "data": {
      "text/html": [
       "            <iframe onload=\"o_resize_iframe_out_5()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_5\" frameBorder=\"0\" srcdoc=\"        &lt;html theme='dark'&gt;\n",
       "        &lt;head&gt;\n",
       "            &lt;style type=&quot;text&sol;css&quot;&gt;\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover &gt; td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "&sol;* formatting *&sol;\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       ":root {\n",
       "    --scroll-bg: #f5f5f5;\n",
       "    --scroll-fg: #b3b3b3;\n",
       "}\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n",
       "    --scroll-bg: #3c3c3c;\n",
       "    --scroll-fg: #97e1fb;\n",
       "}\n",
       "body {\n",
       "    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n",
       "}\n",
       "body::-webkit-scrollbar {\n",
       "    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n",
       "    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n",
       "}\n",
       "body::-webkit-scrollbar-thumb {\n",
       "    background-color: var(--scroll-fg);\n",
       "}\n",
       "body::-webkit-scrollbar-track {\n",
       "    background-color: var(--scroll-bg);\n",
       "}\n",
       "            &lt;&sol;style&gt;\n",
       "        &lt;&sol;head&gt;\n",
       "        &lt;body&gt;\n",
       "            &lt;table class=&quot;dataframe&quot; id=&quot;df_352321546&quot;&gt;&lt;&sol;table&gt;\n",
       "\n",
       "&lt;p class=&quot;dataframe_description&quot;&gt;DataFrame: rowsCount = 2, columnsCount = 2&lt;&sol;p&gt;\n",
       "\n",
       "        &lt;&sol;body&gt;\n",
       "        &lt;script&gt;\n",
       "            (function () {\n",
       "    window.DataFrame = window.DataFrame || new (function () {\n",
       "        this.addTable = function (df) {\n",
       "            let cols = df.cols;\n",
       "            for (let i = 0; i &lt; cols.length; i++) {\n",
       "                for (let c of cols[i].children) {\n",
       "                    cols[c].parent = i;\n",
       "                }\n",
       "            }\n",
       "            df.nrow = 0\n",
       "            for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n",
       "            }\n",
       "            if (df.id === df.rootId) {\n",
       "                df.expandedFrames = new Set()\n",
       "                df.childFrames = {}\n",
       "                const table = this.getTableElement(df.id)\n",
       "                table.df = df\n",
       "                for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                    let col = df.cols[i]\n",
       "                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n",
       "                }\n",
       "            } else {\n",
       "                const rootDf = this.getTableData(df.rootId)\n",
       "                rootDf.childFrames[df.id] = df\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.computeRenderData = function (df) {\n",
       "            let result = []\n",
       "            let pos = 0\n",
       "            for (let col = 0; col &lt; df.cols.length; col++) {\n",
       "                if (df.cols[col].parent === undefined)\n",
       "                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n",
       "            }\n",
       "            for (let i = 0; i &lt; result.length; i++) {\n",
       "                let row = result[i]\n",
       "                for (let j = 0; j &lt; row.length; j++) {\n",
       "                    let cell = row[j]\n",
       "                    if (j === 0)\n",
       "                        cell.leftBd = false\n",
       "                    if (j &lt; row.length - 1) {\n",
       "                        let nextData = row[j + 1]\n",
       "                        if (nextData.leftBd) cell.rightBd = true\n",
       "                        else if (cell.rightBd) nextData.leftBd = true\n",
       "                    } else cell.rightBd = false\n",
       "                }\n",
       "            }\n",
       "            return result\n",
       "        }\n",
       "\n",
       "        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n",
       "            if (result.length === depth) {\n",
       "                const array = [];\n",
       "                if (pos &gt; 0) {\n",
       "                    let j = 0\n",
       "                    for (let i = 0; j &lt; pos; i++) {\n",
       "                        let c = result[depth - 1][i]\n",
       "                        j += c.span\n",
       "                        let copy = Object.assign({empty: true}, c)\n",
       "                        array.push(copy)\n",
       "                    }\n",
       "                }\n",
       "                result.push(array)\n",
       "            }\n",
       "            const col = cols[colId];\n",
       "            let size = 0;\n",
       "            if (col.expanded) {\n",
       "                let childPos = pos\n",
       "                for (let i = 0; i &lt; col.children.length; i++) {\n",
       "                    let child = col.children[i]\n",
       "                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n",
       "                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n",
       "                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n",
       "                    childPos += childSize\n",
       "                    size += childSize\n",
       "                }\n",
       "            } else {\n",
       "                for (let i = depth + 1; i &lt; result.length; i++)\n",
       "                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n",
       "                size = 1\n",
       "            }\n",
       "            let left = leftBorder\n",
       "            let right = rightBorder\n",
       "            if (size &gt; 1) {\n",
       "                left = true\n",
       "                right = true\n",
       "            }\n",
       "            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n",
       "            return size\n",
       "        }\n",
       "\n",
       "        this.getTableElement = function (id) {\n",
       "            return document.getElementById(&quot;df_&quot; + id)\n",
       "        }\n",
       "\n",
       "        this.getTableData = function (id) {\n",
       "            return this.getTableElement(id).df\n",
       "        }\n",
       "\n",
       "        this.createExpander = function (isExpanded) {\n",
       "            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n",
       "            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n",
       "            svg.classList.add(&quot;expanderSvg&quot;)\n",
       "            let path = document.createElementNS(svgNs, &quot;path&quot;)\n",
       "            if (isExpanded) {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n",
       "            } else {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n",
       "            }\n",
       "            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n",
       "            svg.appendChild(path)\n",
       "            return svg\n",
       "        }\n",
       "\n",
       "        this.renderTable = function (id) {\n",
       "\n",
       "            let table = this.getTableElement(id)\n",
       "\n",
       "            if (table === null) return\n",
       "\n",
       "            table.innerHTML = &quot;&quot;\n",
       "\n",
       "            let df = table.df\n",
       "            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n",
       "\n",
       "            &sol;&sol; header\n",
       "            let header = document.createElement(&quot;thead&quot;)\n",
       "            table.appendChild(header)\n",
       "\n",
       "            let renderData = this.computeRenderData(df)\n",
       "            for (let j = 0; j &lt; renderData.length; j++) {\n",
       "                let rowData = renderData[j]\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                let isLastRow = j === renderData.length - 1\n",
       "                header.appendChild(tr);\n",
       "                for (let i = 0; i &lt; rowData.length; i++) {\n",
       "                    let cell = rowData[i]\n",
       "                    let th = document.createElement(&quot;th&quot;);\n",
       "                    th.setAttribute(&quot;colspan&quot;, cell.span)\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId];\n",
       "                    if (!cell.empty) {\n",
       "                        if (col.children.length === 0) {\n",
       "                            th.innerHTML = col.name\n",
       "                        } else {\n",
       "                            let link = document.createElement(&quot;a&quot;)\n",
       "                            link.className = &quot;expander&quot;\n",
       "                            let that = this\n",
       "                            link.onclick = function () {\n",
       "                                col.expanded = !col.expanded\n",
       "                                that.renderTable(id)\n",
       "                            }\n",
       "                            link.appendChild(this.createExpander(col.expanded))\n",
       "                            link.innerHTML += col.name\n",
       "                            th.appendChild(link)\n",
       "                        }\n",
       "                    }\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (isLastRow)\n",
       "                        classes += &quot; bottomBorder&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        th.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(th)\n",
       "                }\n",
       "            }\n",
       "\n",
       "            &sol;&sol; body\n",
       "            let body = document.createElement(&quot;tbody&quot;)\n",
       "            table.appendChild(body)\n",
       "\n",
       "            let columns = renderData.pop()\n",
       "            for (let row = 0; row &lt; df.nrow; row++) {\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                body.appendChild(tr)\n",
       "                for (let i = 0; i &lt; columns.length; i++) {\n",
       "                    let cell = columns[i]\n",
       "                    let td = document.createElement(&quot;td&quot;);\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId]\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        td.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(td)\n",
       "                    let value = col.values[row]\n",
       "                    if (value.frameId !== undefined) {\n",
       "                        let frameId = value.frameId\n",
       "                        let expanded = rootDf.expandedFrames.has(frameId)\n",
       "                        let link = document.createElement(&quot;a&quot;)\n",
       "                        link.className = &quot;expander&quot;\n",
       "                        let that = this\n",
       "                        link.onclick = function () {\n",
       "                            if (rootDf.expandedFrames.has(frameId))\n",
       "                                rootDf.expandedFrames.delete(frameId)\n",
       "                            else rootDf.expandedFrames.add(frameId)\n",
       "                            that.renderTable(id)\n",
       "                        }\n",
       "                        link.appendChild(this.createExpander(expanded))\n",
       "                        link.innerHTML += value.value\n",
       "                        if (expanded) {\n",
       "                            td.appendChild(link)\n",
       "                            td.appendChild(document.createElement(&quot;p&quot;))\n",
       "                            const childTable = document.createElement(&quot;table&quot;)\n",
       "                            childTable.className = &quot;dataframe&quot;\n",
       "                            childTable.id = &quot;df_&quot; + frameId\n",
       "                            let childDf = rootDf.childFrames[frameId]\n",
       "                            childTable.df = childDf\n",
       "                            td.appendChild(childTable)\n",
       "                            this.renderTable(frameId)\n",
       "                            if (childDf.nrow !== childDf.totalRows) {\n",
       "                                const footer = document.createElement(&quot;p&quot;)\n",
       "                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n",
       "                                td.appendChild(footer)\n",
       "                            }\n",
       "                        } else {\n",
       "                            td.appendChild(link)\n",
       "                        }\n",
       "                    } else if (value.style !== undefined) {\n",
       "                        td.innerHTML = value.value\n",
       "                        td.setAttribute(&quot;style&quot;, value.style)\n",
       "                    } else td.innerHTML = value\n",
       "                    this.nodeScriptReplace(td)\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.nodeScriptReplace = function (node) {\n",
       "            if (this.nodeScriptIs(node) === true) {\n",
       "                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n",
       "            } else {\n",
       "                let i = -1, children = node.childNodes;\n",
       "                while (++i &lt; children.length) {\n",
       "                    this.nodeScriptReplace(children[i]);\n",
       "                }\n",
       "            }\n",
       "\n",
       "            return node;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptClone = function (node) {\n",
       "            let script = document.createElement(&quot;script&quot;);\n",
       "            script.text = node.innerHTML;\n",
       "\n",
       "            let i = -1, attrs = node.attributes, attr;\n",
       "            while (++i &lt; attrs.length) {\n",
       "                script.setAttribute((attr = attrs[i]).name, attr.value);\n",
       "            }\n",
       "            return script;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptIs = function (node) {\n",
       "            return node.tagName === 'SCRIPT';\n",
       "        }\n",
       "    })()\n",
       "\n",
       "    window.call_DataFrame = function (f) {\n",
       "        return f();\n",
       "    };\n",
       "\n",
       "    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n",
       "    if (funQueue) {\n",
       "        funQueue.forEach(function (f) {\n",
       "            f();\n",
       "        });\n",
       "        funQueue = [];\n",
       "    }\n",
       "})()\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;group: DataFrame&lt;*&gt;&bsol;&quot;&gt;group&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [{ frameId: 352321547, value: &quot;&lt;b&gt;DataFrame 1 x 5&lt;&sol;b&gt;&quot; },{ frameId: 352321548, value: &quot;&lt;b&gt;DataFrame 1 x 5&lt;&sol;b&gt;&quot; }] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;thousands: Int&bsol;&quot;&gt;thousands&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;0&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;0&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "], id: 352321546, rootId: 352321546, totalRows: 2 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;topics: String&bsol;&quot;&gt;topics&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[kotlin, data-science, data-analysis, dataframe]&bsol;&quot;&gt;[kotlin, data-science, data-analysis,&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;watchers: Int&bsol;&quot;&gt;watchers&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;16&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;full_name: String&bsol;&quot;&gt;full_name&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;Kotlin&sol;dataframe&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;html_url: URL&bsol;&quot;&gt;html_url&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;&lt;a href='https:&sol;&sol;github.com&sol;Kotlin&sol;dataframe' target='_blank'&gt;https:&sol;&sol;github.com&sol;Kotlin&sol;dataframe&lt;&sol;a&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;stargazers_count: Int&bsol;&quot;&gt;stargazers_count&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;773&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "], id: 352321547, rootId: 352321546, totalRows: 1 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;topics: String&bsol;&quot;&gt;topics&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;[kotlin, data-science, data-analysis, dataframe]&bsol;&quot;&gt;[kotlin, data-science, data-analysis,&lt;span class=&bsol;&quot;structural&bsol;&quot;&gt;...&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;watchers: Int&bsol;&quot;&gt;watchers&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;16&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;full_name: String&bsol;&quot;&gt;full_name&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;Kotlin&sol;dataframe&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;html_url: URL&bsol;&quot;&gt;html_url&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;&lt;a href='https:&sol;&sol;github.com&sol;Kotlin&sol;dataframe' target='_blank'&gt;https:&sol;&sol;github.com&sol;Kotlin&sol;dataframe&lt;&sol;a&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;stargazers_count: Int&bsol;&quot;&gt;stargazers_count&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;773&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "], id: 352321548, rootId: 352321546, totalRows: 1 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "call_DataFrame(function() { DataFrame.renderTable(352321546) });\n",
       "\n",
       "\n",
       "        &lt;&sol;script&gt;\n",
       "        &lt;&sol;html&gt;\"></iframe>\n",
       "            <script>\n",
       "                function o_resize_iframe_out_5() {\n",
       "                    let elem = document.getElementById(\"iframe_out_5\");\n",
       "                    resize_iframe_out_5(elem);\n",
       "                    setInterval(resize_iframe_out_5, 5000, elem);\n",
       "                }\n",
       "                function resize_iframe_out_5(el) {\n",
       "                    let h = el.contentWindow.document.body.scrollHeight;\n",
       "                    el.height = h === 0 ? 0 : h + 41;\n",
       "                }\n",
       "            </script>        <html theme='dark'>\n",
       "        <head>\n",
       "            <style type=\"text/css\">\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover > td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "/* formatting */\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       "            </style>\n",
       "        </head>\n",
       "        <body>\n",
       "            <table class=\"dataframe\" id=\"static_df_352321549\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">group</th><th class=\"bottomBorder\" style=\"text-align:left\">thousands</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\"><details><summary>DataFrame [1 x 5]</summary><table class=\"dataframe\" id=\"static_df_352321550\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">topics</th><th class=\"bottomBorder\" style=\"text-align:left\">watchers</th><th class=\"bottomBorder\" style=\"text-align:left\">full_name</th><th class=\"bottomBorder\" style=\"text-align:left\">html_url</th><th class=\"bottomBorder\" style=\"text-align:left\">stargazers_count</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\">[kotlin, data-science, data-analysis,<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">16</td><td  style=\"vertical-align:top\">Kotlin/dataframe</td><td  style=\"vertical-align:top\">https://github.com/Kotlin/dataframe</td><td  style=\"vertical-align:top\">773</td></tr></tbody></table></details></td><td  style=\"vertical-align:top\">0</td></tr><tr><td  style=\"vertical-align:top\"><details><summary>DataFrame [1 x 5]</summary><table class=\"dataframe\" id=\"static_df_352321551\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">topics</th><th class=\"bottomBorder\" style=\"text-align:left\">watchers</th><th class=\"bottomBorder\" style=\"text-align:left\">full_name</th><th class=\"bottomBorder\" style=\"text-align:left\">html_url</th><th class=\"bottomBorder\" style=\"text-align:left\">stargazers_count</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\">[kotlin, data-science, data-analysis,<span class=\"structural\">...</span></td><td  style=\"vertical-align:top\">16</td><td  style=\"vertical-align:top\">Kotlin/dataframe</td><td  style=\"vertical-align:top\">https://github.com/Kotlin/dataframe</td><td  style=\"vertical-align:top\">773</td></tr></tbody></table></details></td><td  style=\"vertical-align:top\">0</td></tr></tbody></table>\n",
       "        </body>\n",
       "        <script>\n",
       "            document.getElementById(\"static_df_352321549\").style.display = \"none\";\n",
       "        </script>\n",
       "        </html>"
      ],
      "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"group\",\"thousands\"],\"types\":[{\"kind\":\"FrameColumn\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"}],\"nrow\":2,\"ncol\":2},\"kotlin_dataframe\":[{\"group\":{\"data\":[{\"topics\":\"[kotlin, data-science, data-analysis, dataframe]\",\"watchers\":16,\"full_name\":\"Kotlin/dataframe\",\"html_url\":\"https://github.com/Kotlin/dataframe\",\"stargazers_count\":773}],\"metadata\":{\"kind\":\"FrameColumn\",\"columns\":[\"topics\",\"watchers\",\"full_name\",\"html_url\",\"stargazers_count\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"java.net.URL\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"}],\"ncol\":5,\"nrow\":1}},\"thousands\":0},{\"group\":{\"data\":[{\"topics\":\"[kotlin, data-science, data-analysis, dataframe]\",\"watchers\":16,\"full_name\":\"Kotlin/dataframe\",\"html_url\":\"https://github.com/Kotlin/dataframe\",\"stargazers_count\":773}],\"metadata\":{\"kind\":\"FrameColumn\",\"columns\":[\"topics\",\"watchers\",\"full_name\",\"html_url\",\"stargazers_count\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"},{\"kind\":\"ValueColumn\",\"type\":\"java.net.URL\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Int\"}],\"ncol\":5,\"nrow\":1}},\"thousands\":0}]}"
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## DataFrame.readExcel(..., stringColumns) parameter\n",
    "[Issue 150](https://github.com/Kotlin/dataframe/issues/150)\n",
    "\n",
    "It gives you more control on how values should be interpreted. Check an example below"
   ]
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:52.915014Z",
     "start_time": "2025-05-28T11:14:50.931555Z"
    }
   },
   "cell_type": "code",
   "source": [
    "// By default readExcel relies on cell value types\n",
    "val excel1 = DataFrame.readExcel(\"mixed_column.xlsx\")\n",
    "excel1"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2025-05-28T11:14:51.172296Z Execution of code '// By default readEx...' ERROR Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "            <iframe onload=\"o_resize_iframe_out_6()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_6\" frameBorder=\"0\" srcdoc=\"        &lt;html theme='dark'&gt;\n",
       "        &lt;head&gt;\n",
       "            &lt;style type=&quot;text&sol;css&quot;&gt;\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover &gt; td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "&sol;* formatting *&sol;\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       ":root {\n",
       "    --scroll-bg: #f5f5f5;\n",
       "    --scroll-fg: #b3b3b3;\n",
       "}\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n",
       "    --scroll-bg: #3c3c3c;\n",
       "    --scroll-fg: #97e1fb;\n",
       "}\n",
       "body {\n",
       "    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n",
       "}\n",
       "body::-webkit-scrollbar {\n",
       "    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n",
       "    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n",
       "}\n",
       "body::-webkit-scrollbar-thumb {\n",
       "    background-color: var(--scroll-fg);\n",
       "}\n",
       "body::-webkit-scrollbar-track {\n",
       "    background-color: var(--scroll-bg);\n",
       "}\n",
       "            &lt;&sol;style&gt;\n",
       "        &lt;&sol;head&gt;\n",
       "        &lt;body&gt;\n",
       "            &lt;table class=&quot;dataframe&quot; id=&quot;df_352321552&quot;&gt;&lt;&sol;table&gt;\n",
       "\n",
       "&lt;p class=&quot;dataframe_description&quot;&gt;DataFrame: rowsCount = 4, columnsCount = 1&lt;&sol;p&gt;\n",
       "\n",
       "        &lt;&sol;body&gt;\n",
       "        &lt;script&gt;\n",
       "            (function () {\n",
       "    window.DataFrame = window.DataFrame || new (function () {\n",
       "        this.addTable = function (df) {\n",
       "            let cols = df.cols;\n",
       "            for (let i = 0; i &lt; cols.length; i++) {\n",
       "                for (let c of cols[i].children) {\n",
       "                    cols[c].parent = i;\n",
       "                }\n",
       "            }\n",
       "            df.nrow = 0\n",
       "            for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n",
       "            }\n",
       "            if (df.id === df.rootId) {\n",
       "                df.expandedFrames = new Set()\n",
       "                df.childFrames = {}\n",
       "                const table = this.getTableElement(df.id)\n",
       "                table.df = df\n",
       "                for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                    let col = df.cols[i]\n",
       "                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n",
       "                }\n",
       "            } else {\n",
       "                const rootDf = this.getTableData(df.rootId)\n",
       "                rootDf.childFrames[df.id] = df\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.computeRenderData = function (df) {\n",
       "            let result = []\n",
       "            let pos = 0\n",
       "            for (let col = 0; col &lt; df.cols.length; col++) {\n",
       "                if (df.cols[col].parent === undefined)\n",
       "                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n",
       "            }\n",
       "            for (let i = 0; i &lt; result.length; i++) {\n",
       "                let row = result[i]\n",
       "                for (let j = 0; j &lt; row.length; j++) {\n",
       "                    let cell = row[j]\n",
       "                    if (j === 0)\n",
       "                        cell.leftBd = false\n",
       "                    if (j &lt; row.length - 1) {\n",
       "                        let nextData = row[j + 1]\n",
       "                        if (nextData.leftBd) cell.rightBd = true\n",
       "                        else if (cell.rightBd) nextData.leftBd = true\n",
       "                    } else cell.rightBd = false\n",
       "                }\n",
       "            }\n",
       "            return result\n",
       "        }\n",
       "\n",
       "        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n",
       "            if (result.length === depth) {\n",
       "                const array = [];\n",
       "                if (pos &gt; 0) {\n",
       "                    let j = 0\n",
       "                    for (let i = 0; j &lt; pos; i++) {\n",
       "                        let c = result[depth - 1][i]\n",
       "                        j += c.span\n",
       "                        let copy = Object.assign({empty: true}, c)\n",
       "                        array.push(copy)\n",
       "                    }\n",
       "                }\n",
       "                result.push(array)\n",
       "            }\n",
       "            const col = cols[colId];\n",
       "            let size = 0;\n",
       "            if (col.expanded) {\n",
       "                let childPos = pos\n",
       "                for (let i = 0; i &lt; col.children.length; i++) {\n",
       "                    let child = col.children[i]\n",
       "                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n",
       "                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n",
       "                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n",
       "                    childPos += childSize\n",
       "                    size += childSize\n",
       "                }\n",
       "            } else {\n",
       "                for (let i = depth + 1; i &lt; result.length; i++)\n",
       "                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n",
       "                size = 1\n",
       "            }\n",
       "            let left = leftBorder\n",
       "            let right = rightBorder\n",
       "            if (size &gt; 1) {\n",
       "                left = true\n",
       "                right = true\n",
       "            }\n",
       "            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n",
       "            return size\n",
       "        }\n",
       "\n",
       "        this.getTableElement = function (id) {\n",
       "            return document.getElementById(&quot;df_&quot; + id)\n",
       "        }\n",
       "\n",
       "        this.getTableData = function (id) {\n",
       "            return this.getTableElement(id).df\n",
       "        }\n",
       "\n",
       "        this.createExpander = function (isExpanded) {\n",
       "            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n",
       "            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n",
       "            svg.classList.add(&quot;expanderSvg&quot;)\n",
       "            let path = document.createElementNS(svgNs, &quot;path&quot;)\n",
       "            if (isExpanded) {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n",
       "            } else {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n",
       "            }\n",
       "            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n",
       "            svg.appendChild(path)\n",
       "            return svg\n",
       "        }\n",
       "\n",
       "        this.renderTable = function (id) {\n",
       "\n",
       "            let table = this.getTableElement(id)\n",
       "\n",
       "            if (table === null) return\n",
       "\n",
       "            table.innerHTML = &quot;&quot;\n",
       "\n",
       "            let df = table.df\n",
       "            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n",
       "\n",
       "            &sol;&sol; header\n",
       "            let header = document.createElement(&quot;thead&quot;)\n",
       "            table.appendChild(header)\n",
       "\n",
       "            let renderData = this.computeRenderData(df)\n",
       "            for (let j = 0; j &lt; renderData.length; j++) {\n",
       "                let rowData = renderData[j]\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                let isLastRow = j === renderData.length - 1\n",
       "                header.appendChild(tr);\n",
       "                for (let i = 0; i &lt; rowData.length; i++) {\n",
       "                    let cell = rowData[i]\n",
       "                    let th = document.createElement(&quot;th&quot;);\n",
       "                    th.setAttribute(&quot;colspan&quot;, cell.span)\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId];\n",
       "                    if (!cell.empty) {\n",
       "                        if (col.children.length === 0) {\n",
       "                            th.innerHTML = col.name\n",
       "                        } else {\n",
       "                            let link = document.createElement(&quot;a&quot;)\n",
       "                            link.className = &quot;expander&quot;\n",
       "                            let that = this\n",
       "                            link.onclick = function () {\n",
       "                                col.expanded = !col.expanded\n",
       "                                that.renderTable(id)\n",
       "                            }\n",
       "                            link.appendChild(this.createExpander(col.expanded))\n",
       "                            link.innerHTML += col.name\n",
       "                            th.appendChild(link)\n",
       "                        }\n",
       "                    }\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (isLastRow)\n",
       "                        classes += &quot; bottomBorder&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        th.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(th)\n",
       "                }\n",
       "            }\n",
       "\n",
       "            &sol;&sol; body\n",
       "            let body = document.createElement(&quot;tbody&quot;)\n",
       "            table.appendChild(body)\n",
       "\n",
       "            let columns = renderData.pop()\n",
       "            for (let row = 0; row &lt; df.nrow; row++) {\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                body.appendChild(tr)\n",
       "                for (let i = 0; i &lt; columns.length; i++) {\n",
       "                    let cell = columns[i]\n",
       "                    let td = document.createElement(&quot;td&quot;);\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId]\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        td.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(td)\n",
       "                    let value = col.values[row]\n",
       "                    if (value.frameId !== undefined) {\n",
       "                        let frameId = value.frameId\n",
       "                        let expanded = rootDf.expandedFrames.has(frameId)\n",
       "                        let link = document.createElement(&quot;a&quot;)\n",
       "                        link.className = &quot;expander&quot;\n",
       "                        let that = this\n",
       "                        link.onclick = function () {\n",
       "                            if (rootDf.expandedFrames.has(frameId))\n",
       "                                rootDf.expandedFrames.delete(frameId)\n",
       "                            else rootDf.expandedFrames.add(frameId)\n",
       "                            that.renderTable(id)\n",
       "                        }\n",
       "                        link.appendChild(this.createExpander(expanded))\n",
       "                        link.innerHTML += value.value\n",
       "                        if (expanded) {\n",
       "                            td.appendChild(link)\n",
       "                            td.appendChild(document.createElement(&quot;p&quot;))\n",
       "                            const childTable = document.createElement(&quot;table&quot;)\n",
       "                            childTable.className = &quot;dataframe&quot;\n",
       "                            childTable.id = &quot;df_&quot; + frameId\n",
       "                            let childDf = rootDf.childFrames[frameId]\n",
       "                            childTable.df = childDf\n",
       "                            td.appendChild(childTable)\n",
       "                            this.renderTable(frameId)\n",
       "                            if (childDf.nrow !== childDf.totalRows) {\n",
       "                                const footer = document.createElement(&quot;p&quot;)\n",
       "                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n",
       "                                td.appendChild(footer)\n",
       "                            }\n",
       "                        } else {\n",
       "                            td.appendChild(link)\n",
       "                        }\n",
       "                    } else if (value.style !== undefined) {\n",
       "                        td.innerHTML = value.value\n",
       "                        td.setAttribute(&quot;style&quot;, value.style)\n",
       "                    } else td.innerHTML = value\n",
       "                    this.nodeScriptReplace(td)\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.nodeScriptReplace = function (node) {\n",
       "            if (this.nodeScriptIs(node) === true) {\n",
       "                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n",
       "            } else {\n",
       "                let i = -1, children = node.childNodes;\n",
       "                while (++i &lt; children.length) {\n",
       "                    this.nodeScriptReplace(children[i]);\n",
       "                }\n",
       "            }\n",
       "\n",
       "            return node;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptClone = function (node) {\n",
       "            let script = document.createElement(&quot;script&quot;);\n",
       "            script.text = node.innerHTML;\n",
       "\n",
       "            let i = -1, attrs = node.attributes, attr;\n",
       "            while (++i &lt; attrs.length) {\n",
       "                script.setAttribute((attr = attrs[i]).name, attr.value);\n",
       "            }\n",
       "            return script;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptIs = function (node) {\n",
       "            return node.tagName === 'SCRIPT';\n",
       "        }\n",
       "    })()\n",
       "\n",
       "    window.call_DataFrame = function (f) {\n",
       "        return f();\n",
       "    };\n",
       "\n",
       "    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n",
       "    if (funQueue) {\n",
       "        funQueue.forEach(function (f) {\n",
       "            f();\n",
       "        });\n",
       "        funQueue = [];\n",
       "    }\n",
       "})()\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;col1: Comparable&lt;*&gt;&bsol;&quot;&gt;col1&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;100.0&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;A100&quot;,&quot;B100&quot;,&quot;C100&quot;] }, \n",
       "], id: 352321552, rootId: 352321552, totalRows: 4 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "call_DataFrame(function() { DataFrame.renderTable(352321552) });\n",
       "\n",
       "\n",
       "        &lt;&sol;script&gt;\n",
       "        &lt;&sol;html&gt;\"></iframe>\n",
       "            <script>\n",
       "                function o_resize_iframe_out_6() {\n",
       "                    let elem = document.getElementById(\"iframe_out_6\");\n",
       "                    resize_iframe_out_6(elem);\n",
       "                    setInterval(resize_iframe_out_6, 5000, elem);\n",
       "                }\n",
       "                function resize_iframe_out_6(el) {\n",
       "                    let h = el.contentWindow.document.body.scrollHeight;\n",
       "                    el.height = h === 0 ? 0 : h + 41;\n",
       "                }\n",
       "            </script>        <html theme='dark'>\n",
       "        <head>\n",
       "            <style type=\"text/css\">\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover > td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "/* formatting */\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       "            </style>\n",
       "        </head>\n",
       "        <body>\n",
       "            <table class=\"dataframe\" id=\"static_df_352321553\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">col1</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\">100.000000</td></tr><tr><td  style=\"vertical-align:top\">A100</td></tr><tr><td  style=\"vertical-align:top\">B100</td></tr><tr><td  style=\"vertical-align:top\">C100</td></tr></tbody></table>\n",
       "        </body>\n",
       "        <script>\n",
       "            document.getElementById(\"static_df_352321553\").style.display = \"none\";\n",
       "        </script>\n",
       "        </html>"
      ],
      "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"col1\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Comparable<*>\"}],\"nrow\":4,\"ncol\":1},\"kotlin_dataframe\":[{\"col1\":\"100.0\"},{\"col1\":\"A100\"},{\"col1\":\"B100\"},{\"col1\":\"C100\"}]}"
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:53.062949Z",
     "start_time": "2025-05-28T11:14:52.923747Z"
    }
   },
   "cell_type": "code",
   "source": [
    "// col1 is Double & String\n",
    "excel1.schema()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "col1: Comparable<*>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:53.584501Z",
     "start_time": "2025-05-28T11:14:53.067316Z"
    }
   },
   "cell_type": "code",
   "source": [
    "val excel2 = DataFrame.readExcel(\"mixed_column.xlsx\", stringColumns = StringColumns(\"A\"))\n",
    "excel2"
   ],
   "outputs": [
    {
     "data": {
      "text/html": [
       "            <iframe onload=\"o_resize_iframe_out_7()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_7\" frameBorder=\"0\" srcdoc=\"        &lt;html theme='dark'&gt;\n",
       "        &lt;head&gt;\n",
       "            &lt;style type=&quot;text&sol;css&quot;&gt;\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover &gt; td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "&sol;* formatting *&sol;\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       ":root {\n",
       "    --scroll-bg: #f5f5f5;\n",
       "    --scroll-fg: #b3b3b3;\n",
       "}\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n",
       "    --scroll-bg: #3c3c3c;\n",
       "    --scroll-fg: #97e1fb;\n",
       "}\n",
       "body {\n",
       "    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n",
       "}\n",
       "body::-webkit-scrollbar {\n",
       "    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n",
       "    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n",
       "}\n",
       "body::-webkit-scrollbar-thumb {\n",
       "    background-color: var(--scroll-fg);\n",
       "}\n",
       "body::-webkit-scrollbar-track {\n",
       "    background-color: var(--scroll-bg);\n",
       "}\n",
       "            &lt;&sol;style&gt;\n",
       "        &lt;&sol;head&gt;\n",
       "        &lt;body&gt;\n",
       "            &lt;table class=&quot;dataframe&quot; id=&quot;df_352321554&quot;&gt;&lt;&sol;table&gt;\n",
       "\n",
       "&lt;p class=&quot;dataframe_description&quot;&gt;DataFrame: rowsCount = 4, columnsCount = 1&lt;&sol;p&gt;\n",
       "\n",
       "        &lt;&sol;body&gt;\n",
       "        &lt;script&gt;\n",
       "            (function () {\n",
       "    window.DataFrame = window.DataFrame || new (function () {\n",
       "        this.addTable = function (df) {\n",
       "            let cols = df.cols;\n",
       "            for (let i = 0; i &lt; cols.length; i++) {\n",
       "                for (let c of cols[i].children) {\n",
       "                    cols[c].parent = i;\n",
       "                }\n",
       "            }\n",
       "            df.nrow = 0\n",
       "            for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n",
       "            }\n",
       "            if (df.id === df.rootId) {\n",
       "                df.expandedFrames = new Set()\n",
       "                df.childFrames = {}\n",
       "                const table = this.getTableElement(df.id)\n",
       "                table.df = df\n",
       "                for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                    let col = df.cols[i]\n",
       "                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n",
       "                }\n",
       "            } else {\n",
       "                const rootDf = this.getTableData(df.rootId)\n",
       "                rootDf.childFrames[df.id] = df\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.computeRenderData = function (df) {\n",
       "            let result = []\n",
       "            let pos = 0\n",
       "            for (let col = 0; col &lt; df.cols.length; col++) {\n",
       "                if (df.cols[col].parent === undefined)\n",
       "                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n",
       "            }\n",
       "            for (let i = 0; i &lt; result.length; i++) {\n",
       "                let row = result[i]\n",
       "                for (let j = 0; j &lt; row.length; j++) {\n",
       "                    let cell = row[j]\n",
       "                    if (j === 0)\n",
       "                        cell.leftBd = false\n",
       "                    if (j &lt; row.length - 1) {\n",
       "                        let nextData = row[j + 1]\n",
       "                        if (nextData.leftBd) cell.rightBd = true\n",
       "                        else if (cell.rightBd) nextData.leftBd = true\n",
       "                    } else cell.rightBd = false\n",
       "                }\n",
       "            }\n",
       "            return result\n",
       "        }\n",
       "\n",
       "        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n",
       "            if (result.length === depth) {\n",
       "                const array = [];\n",
       "                if (pos &gt; 0) {\n",
       "                    let j = 0\n",
       "                    for (let i = 0; j &lt; pos; i++) {\n",
       "                        let c = result[depth - 1][i]\n",
       "                        j += c.span\n",
       "                        let copy = Object.assign({empty: true}, c)\n",
       "                        array.push(copy)\n",
       "                    }\n",
       "                }\n",
       "                result.push(array)\n",
       "            }\n",
       "            const col = cols[colId];\n",
       "            let size = 0;\n",
       "            if (col.expanded) {\n",
       "                let childPos = pos\n",
       "                for (let i = 0; i &lt; col.children.length; i++) {\n",
       "                    let child = col.children[i]\n",
       "                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n",
       "                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n",
       "                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n",
       "                    childPos += childSize\n",
       "                    size += childSize\n",
       "                }\n",
       "            } else {\n",
       "                for (let i = depth + 1; i &lt; result.length; i++)\n",
       "                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n",
       "                size = 1\n",
       "            }\n",
       "            let left = leftBorder\n",
       "            let right = rightBorder\n",
       "            if (size &gt; 1) {\n",
       "                left = true\n",
       "                right = true\n",
       "            }\n",
       "            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n",
       "            return size\n",
       "        }\n",
       "\n",
       "        this.getTableElement = function (id) {\n",
       "            return document.getElementById(&quot;df_&quot; + id)\n",
       "        }\n",
       "\n",
       "        this.getTableData = function (id) {\n",
       "            return this.getTableElement(id).df\n",
       "        }\n",
       "\n",
       "        this.createExpander = function (isExpanded) {\n",
       "            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n",
       "            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n",
       "            svg.classList.add(&quot;expanderSvg&quot;)\n",
       "            let path = document.createElementNS(svgNs, &quot;path&quot;)\n",
       "            if (isExpanded) {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n",
       "            } else {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n",
       "            }\n",
       "            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n",
       "            svg.appendChild(path)\n",
       "            return svg\n",
       "        }\n",
       "\n",
       "        this.renderTable = function (id) {\n",
       "\n",
       "            let table = this.getTableElement(id)\n",
       "\n",
       "            if (table === null) return\n",
       "\n",
       "            table.innerHTML = &quot;&quot;\n",
       "\n",
       "            let df = table.df\n",
       "            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n",
       "\n",
       "            &sol;&sol; header\n",
       "            let header = document.createElement(&quot;thead&quot;)\n",
       "            table.appendChild(header)\n",
       "\n",
       "            let renderData = this.computeRenderData(df)\n",
       "            for (let j = 0; j &lt; renderData.length; j++) {\n",
       "                let rowData = renderData[j]\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                let isLastRow = j === renderData.length - 1\n",
       "                header.appendChild(tr);\n",
       "                for (let i = 0; i &lt; rowData.length; i++) {\n",
       "                    let cell = rowData[i]\n",
       "                    let th = document.createElement(&quot;th&quot;);\n",
       "                    th.setAttribute(&quot;colspan&quot;, cell.span)\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId];\n",
       "                    if (!cell.empty) {\n",
       "                        if (col.children.length === 0) {\n",
       "                            th.innerHTML = col.name\n",
       "                        } else {\n",
       "                            let link = document.createElement(&quot;a&quot;)\n",
       "                            link.className = &quot;expander&quot;\n",
       "                            let that = this\n",
       "                            link.onclick = function () {\n",
       "                                col.expanded = !col.expanded\n",
       "                                that.renderTable(id)\n",
       "                            }\n",
       "                            link.appendChild(this.createExpander(col.expanded))\n",
       "                            link.innerHTML += col.name\n",
       "                            th.appendChild(link)\n",
       "                        }\n",
       "                    }\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (isLastRow)\n",
       "                        classes += &quot; bottomBorder&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        th.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(th)\n",
       "                }\n",
       "            }\n",
       "\n",
       "            &sol;&sol; body\n",
       "            let body = document.createElement(&quot;tbody&quot;)\n",
       "            table.appendChild(body)\n",
       "\n",
       "            let columns = renderData.pop()\n",
       "            for (let row = 0; row &lt; df.nrow; row++) {\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                body.appendChild(tr)\n",
       "                for (let i = 0; i &lt; columns.length; i++) {\n",
       "                    let cell = columns[i]\n",
       "                    let td = document.createElement(&quot;td&quot;);\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId]\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        td.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(td)\n",
       "                    let value = col.values[row]\n",
       "                    if (value.frameId !== undefined) {\n",
       "                        let frameId = value.frameId\n",
       "                        let expanded = rootDf.expandedFrames.has(frameId)\n",
       "                        let link = document.createElement(&quot;a&quot;)\n",
       "                        link.className = &quot;expander&quot;\n",
       "                        let that = this\n",
       "                        link.onclick = function () {\n",
       "                            if (rootDf.expandedFrames.has(frameId))\n",
       "                                rootDf.expandedFrames.delete(frameId)\n",
       "                            else rootDf.expandedFrames.add(frameId)\n",
       "                            that.renderTable(id)\n",
       "                        }\n",
       "                        link.appendChild(this.createExpander(expanded))\n",
       "                        link.innerHTML += value.value\n",
       "                        if (expanded) {\n",
       "                            td.appendChild(link)\n",
       "                            td.appendChild(document.createElement(&quot;p&quot;))\n",
       "                            const childTable = document.createElement(&quot;table&quot;)\n",
       "                            childTable.className = &quot;dataframe&quot;\n",
       "                            childTable.id = &quot;df_&quot; + frameId\n",
       "                            let childDf = rootDf.childFrames[frameId]\n",
       "                            childTable.df = childDf\n",
       "                            td.appendChild(childTable)\n",
       "                            this.renderTable(frameId)\n",
       "                            if (childDf.nrow !== childDf.totalRows) {\n",
       "                                const footer = document.createElement(&quot;p&quot;)\n",
       "                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n",
       "                                td.appendChild(footer)\n",
       "                            }\n",
       "                        } else {\n",
       "                            td.appendChild(link)\n",
       "                        }\n",
       "                    } else if (value.style !== undefined) {\n",
       "                        td.innerHTML = value.value\n",
       "                        td.setAttribute(&quot;style&quot;, value.style)\n",
       "                    } else td.innerHTML = value\n",
       "                    this.nodeScriptReplace(td)\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.nodeScriptReplace = function (node) {\n",
       "            if (this.nodeScriptIs(node) === true) {\n",
       "                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n",
       "            } else {\n",
       "                let i = -1, children = node.childNodes;\n",
       "                while (++i &lt; children.length) {\n",
       "                    this.nodeScriptReplace(children[i]);\n",
       "                }\n",
       "            }\n",
       "\n",
       "            return node;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptClone = function (node) {\n",
       "            let script = document.createElement(&quot;script&quot;);\n",
       "            script.text = node.innerHTML;\n",
       "\n",
       "            let i = -1, attrs = node.attributes, attr;\n",
       "            while (++i &lt; attrs.length) {\n",
       "                script.setAttribute((attr = attrs[i]).name, attr.value);\n",
       "            }\n",
       "            return script;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptIs = function (node) {\n",
       "            return node.tagName === 'SCRIPT';\n",
       "        }\n",
       "    })()\n",
       "\n",
       "    window.call_DataFrame = function (f) {\n",
       "        return f();\n",
       "    };\n",
       "\n",
       "    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n",
       "    if (funQueue) {\n",
       "        funQueue.forEach(function (f) {\n",
       "            f();\n",
       "        });\n",
       "        funQueue = [];\n",
       "    }\n",
       "})()\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;col1: String&bsol;&quot;&gt;col1&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;100&quot;,&quot;A100&quot;,&quot;B100&quot;,&quot;C100&quot;] }, \n",
       "], id: 352321554, rootId: 352321554, totalRows: 4 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "call_DataFrame(function() { DataFrame.renderTable(352321554) });\n",
       "\n",
       "\n",
       "        &lt;&sol;script&gt;\n",
       "        &lt;&sol;html&gt;\"></iframe>\n",
       "            <script>\n",
       "                function o_resize_iframe_out_7() {\n",
       "                    let elem = document.getElementById(\"iframe_out_7\");\n",
       "                    resize_iframe_out_7(elem);\n",
       "                    setInterval(resize_iframe_out_7, 5000, elem);\n",
       "                }\n",
       "                function resize_iframe_out_7(el) {\n",
       "                    let h = el.contentWindow.document.body.scrollHeight;\n",
       "                    el.height = h === 0 ? 0 : h + 41;\n",
       "                }\n",
       "            </script>        <html theme='dark'>\n",
       "        <head>\n",
       "            <style type=\"text/css\">\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover > td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "/* formatting */\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       "            </style>\n",
       "        </head>\n",
       "        <body>\n",
       "            <table class=\"dataframe\" id=\"static_df_352321555\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">col1</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\">100</td></tr><tr><td  style=\"vertical-align:top\">A100</td></tr><tr><td  style=\"vertical-align:top\">B100</td></tr><tr><td  style=\"vertical-align:top\">C100</td></tr></tbody></table>\n",
       "        </body>\n",
       "        <script>\n",
       "            document.getElementById(\"static_df_352321555\").style.display = \"none\";\n",
       "        </script>\n",
       "        </html>"
      ],
      "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"col1\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"kotlin.String\"}],\"nrow\":4,\"ncol\":1},\"kotlin_dataframe\":[{\"col1\":\"100\"},{\"col1\":\"A100\"},{\"col1\":\"B100\"},{\"col1\":\"C100\"}]}"
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:53.682969Z",
     "start_time": "2025-05-28T11:14:53.590695Z"
    }
   },
   "cell_type": "code",
   "source": [
    "excel2.schema()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "col1: String"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## Iterable<T>.toDataFrame(columnName)\n",
    "This is an easy way to create a DataFrame when you have a list of Files, URLs, or a structure\n",
    "you want to extract data from.\n",
    "In a notebook,\n",
    "it can be convenient to start from the column of these values to see the number of rows, their `toString` in a table\n",
    "and then iteratively add columns with the parts of the data you're interested in.\n",
    "It could be a File's content, a specific section of an HTML document, some metadata, etc."
   ]
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:54.111489Z",
     "start_time": "2025-05-28T11:14:53.692638Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import kotlin.io.path.Path\n",
    "import kotlin.io.path.listDirectoryEntries\n",
    "\n",
    "val csvs = Path(\".\").listDirectoryEntries(\"*.csv\").toDataFrame(columnName = \"file\")\n",
    "csvs"
   ],
   "outputs": [
    {
     "data": {
      "text/html": [
       "            <iframe onload=\"o_resize_iframe_out_8()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_8\" frameBorder=\"0\" srcdoc=\"        &lt;html theme='dark'&gt;\n",
       "        &lt;head&gt;\n",
       "            &lt;style type=&quot;text&sol;css&quot;&gt;\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover &gt; td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "&sol;* formatting *&sol;\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       ":root {\n",
       "    --scroll-bg: #f5f5f5;\n",
       "    --scroll-fg: #b3b3b3;\n",
       "}\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n",
       "    --scroll-bg: #3c3c3c;\n",
       "    --scroll-fg: #97e1fb;\n",
       "}\n",
       "body {\n",
       "    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n",
       "}\n",
       "body::-webkit-scrollbar {\n",
       "    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n",
       "    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n",
       "}\n",
       "body::-webkit-scrollbar-thumb {\n",
       "    background-color: var(--scroll-fg);\n",
       "}\n",
       "body::-webkit-scrollbar-track {\n",
       "    background-color: var(--scroll-bg);\n",
       "}\n",
       "            &lt;&sol;style&gt;\n",
       "        &lt;&sol;head&gt;\n",
       "        &lt;body&gt;\n",
       "            &lt;table class=&quot;dataframe&quot; id=&quot;df_352321556&quot;&gt;&lt;&sol;table&gt;\n",
       "\n",
       "&lt;p class=&quot;dataframe_description&quot;&gt;DataFrame: rowsCount = 2, columnsCount = 1&lt;&sol;p&gt;\n",
       "\n",
       "        &lt;&sol;body&gt;\n",
       "        &lt;script&gt;\n",
       "            (function () {\n",
       "    window.DataFrame = window.DataFrame || new (function () {\n",
       "        this.addTable = function (df) {\n",
       "            let cols = df.cols;\n",
       "            for (let i = 0; i &lt; cols.length; i++) {\n",
       "                for (let c of cols[i].children) {\n",
       "                    cols[c].parent = i;\n",
       "                }\n",
       "            }\n",
       "            df.nrow = 0\n",
       "            for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n",
       "            }\n",
       "            if (df.id === df.rootId) {\n",
       "                df.expandedFrames = new Set()\n",
       "                df.childFrames = {}\n",
       "                const table = this.getTableElement(df.id)\n",
       "                table.df = df\n",
       "                for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                    let col = df.cols[i]\n",
       "                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n",
       "                }\n",
       "            } else {\n",
       "                const rootDf = this.getTableData(df.rootId)\n",
       "                rootDf.childFrames[df.id] = df\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.computeRenderData = function (df) {\n",
       "            let result = []\n",
       "            let pos = 0\n",
       "            for (let col = 0; col &lt; df.cols.length; col++) {\n",
       "                if (df.cols[col].parent === undefined)\n",
       "                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n",
       "            }\n",
       "            for (let i = 0; i &lt; result.length; i++) {\n",
       "                let row = result[i]\n",
       "                for (let j = 0; j &lt; row.length; j++) {\n",
       "                    let cell = row[j]\n",
       "                    if (j === 0)\n",
       "                        cell.leftBd = false\n",
       "                    if (j &lt; row.length - 1) {\n",
       "                        let nextData = row[j + 1]\n",
       "                        if (nextData.leftBd) cell.rightBd = true\n",
       "                        else if (cell.rightBd) nextData.leftBd = true\n",
       "                    } else cell.rightBd = false\n",
       "                }\n",
       "            }\n",
       "            return result\n",
       "        }\n",
       "\n",
       "        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n",
       "            if (result.length === depth) {\n",
       "                const array = [];\n",
       "                if (pos &gt; 0) {\n",
       "                    let j = 0\n",
       "                    for (let i = 0; j &lt; pos; i++) {\n",
       "                        let c = result[depth - 1][i]\n",
       "                        j += c.span\n",
       "                        let copy = Object.assign({empty: true}, c)\n",
       "                        array.push(copy)\n",
       "                    }\n",
       "                }\n",
       "                result.push(array)\n",
       "            }\n",
       "            const col = cols[colId];\n",
       "            let size = 0;\n",
       "            if (col.expanded) {\n",
       "                let childPos = pos\n",
       "                for (let i = 0; i &lt; col.children.length; i++) {\n",
       "                    let child = col.children[i]\n",
       "                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n",
       "                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n",
       "                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n",
       "                    childPos += childSize\n",
       "                    size += childSize\n",
       "                }\n",
       "            } else {\n",
       "                for (let i = depth + 1; i &lt; result.length; i++)\n",
       "                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n",
       "                size = 1\n",
       "            }\n",
       "            let left = leftBorder\n",
       "            let right = rightBorder\n",
       "            if (size &gt; 1) {\n",
       "                left = true\n",
       "                right = true\n",
       "            }\n",
       "            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n",
       "            return size\n",
       "        }\n",
       "\n",
       "        this.getTableElement = function (id) {\n",
       "            return document.getElementById(&quot;df_&quot; + id)\n",
       "        }\n",
       "\n",
       "        this.getTableData = function (id) {\n",
       "            return this.getTableElement(id).df\n",
       "        }\n",
       "\n",
       "        this.createExpander = function (isExpanded) {\n",
       "            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n",
       "            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n",
       "            svg.classList.add(&quot;expanderSvg&quot;)\n",
       "            let path = document.createElementNS(svgNs, &quot;path&quot;)\n",
       "            if (isExpanded) {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n",
       "            } else {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n",
       "            }\n",
       "            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n",
       "            svg.appendChild(path)\n",
       "            return svg\n",
       "        }\n",
       "\n",
       "        this.renderTable = function (id) {\n",
       "\n",
       "            let table = this.getTableElement(id)\n",
       "\n",
       "            if (table === null) return\n",
       "\n",
       "            table.innerHTML = &quot;&quot;\n",
       "\n",
       "            let df = table.df\n",
       "            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n",
       "\n",
       "            &sol;&sol; header\n",
       "            let header = document.createElement(&quot;thead&quot;)\n",
       "            table.appendChild(header)\n",
       "\n",
       "            let renderData = this.computeRenderData(df)\n",
       "            for (let j = 0; j &lt; renderData.length; j++) {\n",
       "                let rowData = renderData[j]\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                let isLastRow = j === renderData.length - 1\n",
       "                header.appendChild(tr);\n",
       "                for (let i = 0; i &lt; rowData.length; i++) {\n",
       "                    let cell = rowData[i]\n",
       "                    let th = document.createElement(&quot;th&quot;);\n",
       "                    th.setAttribute(&quot;colspan&quot;, cell.span)\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId];\n",
       "                    if (!cell.empty) {\n",
       "                        if (col.children.length === 0) {\n",
       "                            th.innerHTML = col.name\n",
       "                        } else {\n",
       "                            let link = document.createElement(&quot;a&quot;)\n",
       "                            link.className = &quot;expander&quot;\n",
       "                            let that = this\n",
       "                            link.onclick = function () {\n",
       "                                col.expanded = !col.expanded\n",
       "                                that.renderTable(id)\n",
       "                            }\n",
       "                            link.appendChild(this.createExpander(col.expanded))\n",
       "                            link.innerHTML += col.name\n",
       "                            th.appendChild(link)\n",
       "                        }\n",
       "                    }\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (isLastRow)\n",
       "                        classes += &quot; bottomBorder&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        th.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(th)\n",
       "                }\n",
       "            }\n",
       "\n",
       "            &sol;&sol; body\n",
       "            let body = document.createElement(&quot;tbody&quot;)\n",
       "            table.appendChild(body)\n",
       "\n",
       "            let columns = renderData.pop()\n",
       "            for (let row = 0; row &lt; df.nrow; row++) {\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                body.appendChild(tr)\n",
       "                for (let i = 0; i &lt; columns.length; i++) {\n",
       "                    let cell = columns[i]\n",
       "                    let td = document.createElement(&quot;td&quot;);\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId]\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        td.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(td)\n",
       "                    let value = col.values[row]\n",
       "                    if (value.frameId !== undefined) {\n",
       "                        let frameId = value.frameId\n",
       "                        let expanded = rootDf.expandedFrames.has(frameId)\n",
       "                        let link = document.createElement(&quot;a&quot;)\n",
       "                        link.className = &quot;expander&quot;\n",
       "                        let that = this\n",
       "                        link.onclick = function () {\n",
       "                            if (rootDf.expandedFrames.has(frameId))\n",
       "                                rootDf.expandedFrames.delete(frameId)\n",
       "                            else rootDf.expandedFrames.add(frameId)\n",
       "                            that.renderTable(id)\n",
       "                        }\n",
       "                        link.appendChild(this.createExpander(expanded))\n",
       "                        link.innerHTML += value.value\n",
       "                        if (expanded) {\n",
       "                            td.appendChild(link)\n",
       "                            td.appendChild(document.createElement(&quot;p&quot;))\n",
       "                            const childTable = document.createElement(&quot;table&quot;)\n",
       "                            childTable.className = &quot;dataframe&quot;\n",
       "                            childTable.id = &quot;df_&quot; + frameId\n",
       "                            let childDf = rootDf.childFrames[frameId]\n",
       "                            childTable.df = childDf\n",
       "                            td.appendChild(childTable)\n",
       "                            this.renderTable(frameId)\n",
       "                            if (childDf.nrow !== childDf.totalRows) {\n",
       "                                const footer = document.createElement(&quot;p&quot;)\n",
       "                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n",
       "                                td.appendChild(footer)\n",
       "                            }\n",
       "                        } else {\n",
       "                            td.appendChild(link)\n",
       "                        }\n",
       "                    } else if (value.style !== undefined) {\n",
       "                        td.innerHTML = value.value\n",
       "                        td.setAttribute(&quot;style&quot;, value.style)\n",
       "                    } else td.innerHTML = value\n",
       "                    this.nodeScriptReplace(td)\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.nodeScriptReplace = function (node) {\n",
       "            if (this.nodeScriptIs(node) === true) {\n",
       "                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n",
       "            } else {\n",
       "                let i = -1, children = node.childNodes;\n",
       "                while (++i &lt; children.length) {\n",
       "                    this.nodeScriptReplace(children[i]);\n",
       "                }\n",
       "            }\n",
       "\n",
       "            return node;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptClone = function (node) {\n",
       "            let script = document.createElement(&quot;script&quot;);\n",
       "            script.text = node.innerHTML;\n",
       "\n",
       "            let i = -1, attrs = node.attributes, attr;\n",
       "            while (++i &lt; attrs.length) {\n",
       "                script.setAttribute((attr = attrs[i]).name, attr.value);\n",
       "            }\n",
       "            return script;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptIs = function (node) {\n",
       "            return node.tagName === 'SCRIPT';\n",
       "        }\n",
       "    })()\n",
       "\n",
       "    window.call_DataFrame = function (f) {\n",
       "        return f();\n",
       "    };\n",
       "\n",
       "    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n",
       "    if (funQueue) {\n",
       "        funQueue.forEach(function (f) {\n",
       "            f();\n",
       "        });\n",
       "        funQueue = [];\n",
       "    }\n",
       "})()\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;file: java.nio.file.Path&bsol;&quot;&gt;file&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;.&sol;data.csv&quot;,&quot;.&sol;data1.csv&quot;] }, \n",
       "], id: 352321556, rootId: 352321556, totalRows: 2 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "call_DataFrame(function() { DataFrame.renderTable(352321556) });\n",
       "\n",
       "\n",
       "        &lt;&sol;script&gt;\n",
       "        &lt;&sol;html&gt;\"></iframe>\n",
       "            <script>\n",
       "                function o_resize_iframe_out_8() {\n",
       "                    let elem = document.getElementById(\"iframe_out_8\");\n",
       "                    resize_iframe_out_8(elem);\n",
       "                    setInterval(resize_iframe_out_8, 5000, elem);\n",
       "                }\n",
       "                function resize_iframe_out_8(el) {\n",
       "                    let h = el.contentWindow.document.body.scrollHeight;\n",
       "                    el.height = h === 0 ? 0 : h + 41;\n",
       "                }\n",
       "            </script>        <html theme='dark'>\n",
       "        <head>\n",
       "            <style type=\"text/css\">\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover > td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "/* formatting */\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       "            </style>\n",
       "        </head>\n",
       "        <body>\n",
       "            <table class=\"dataframe\" id=\"static_df_352321557\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">file</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\">./data.csv</td></tr><tr><td  style=\"vertical-align:top\">./data1.csv</td></tr></tbody></table>\n",
       "        </body>\n",
       "        <script>\n",
       "            document.getElementById(\"static_df_352321557\").style.display = \"none\";\n",
       "        </script>\n",
       "        </html>"
      ],
      "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"file\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"java.nio.file.Path\"}],\"nrow\":2,\"ncol\":1},\"kotlin_dataframe\":[{\"file\":\"./data.csv\"},{\"file\":\"./data1.csv\"}]}"
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 19
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:54.381659Z",
     "start_time": "2025-05-28T11:14:54.116662Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import kotlin.io.path.fileSize\n",
    "\n",
    "csvs.add { \n",
    "    \"size\" from { file.fileSize() }\n",
    "    \"data\" from { file.toFile().readDataFrame() }\n",
    "}"
   ],
   "outputs": [
    {
     "data": {
      "text/html": [
       "            <iframe onload=\"o_resize_iframe_out_9()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_9\" frameBorder=\"0\" srcdoc=\"        &lt;html theme='dark'&gt;\n",
       "        &lt;head&gt;\n",
       "            &lt;style type=&quot;text&sol;css&quot;&gt;\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody &gt; tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover &gt; td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "&sol;* formatting *&sol;\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       ":root {\n",
       "    --scroll-bg: #f5f5f5;\n",
       "    --scroll-fg: #b3b3b3;\n",
       "}\n",
       ":root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n",
       "    --scroll-bg: #3c3c3c;\n",
       "    --scroll-fg: #97e1fb;\n",
       "}\n",
       "body {\n",
       "    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n",
       "}\n",
       "body::-webkit-scrollbar {\n",
       "    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n",
       "    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n",
       "}\n",
       "body::-webkit-scrollbar-thumb {\n",
       "    background-color: var(--scroll-fg);\n",
       "}\n",
       "body::-webkit-scrollbar-track {\n",
       "    background-color: var(--scroll-bg);\n",
       "}\n",
       "            &lt;&sol;style&gt;\n",
       "        &lt;&sol;head&gt;\n",
       "        &lt;body&gt;\n",
       "            &lt;table class=&quot;dataframe&quot; id=&quot;df_352321558&quot;&gt;&lt;&sol;table&gt;\n",
       "\n",
       "&lt;p class=&quot;dataframe_description&quot;&gt;DataFrame: rowsCount = 2, columnsCount = 3&lt;&sol;p&gt;\n",
       "\n",
       "        &lt;&sol;body&gt;\n",
       "        &lt;script&gt;\n",
       "            (function () {\n",
       "    window.DataFrame = window.DataFrame || new (function () {\n",
       "        this.addTable = function (df) {\n",
       "            let cols = df.cols;\n",
       "            for (let i = 0; i &lt; cols.length; i++) {\n",
       "                for (let c of cols[i].children) {\n",
       "                    cols[c].parent = i;\n",
       "                }\n",
       "            }\n",
       "            df.nrow = 0\n",
       "            for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n",
       "            }\n",
       "            if (df.id === df.rootId) {\n",
       "                df.expandedFrames = new Set()\n",
       "                df.childFrames = {}\n",
       "                const table = this.getTableElement(df.id)\n",
       "                table.df = df\n",
       "                for (let i = 0; i &lt; df.cols.length; i++) {\n",
       "                    let col = df.cols[i]\n",
       "                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n",
       "                }\n",
       "            } else {\n",
       "                const rootDf = this.getTableData(df.rootId)\n",
       "                rootDf.childFrames[df.id] = df\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.computeRenderData = function (df) {\n",
       "            let result = []\n",
       "            let pos = 0\n",
       "            for (let col = 0; col &lt; df.cols.length; col++) {\n",
       "                if (df.cols[col].parent === undefined)\n",
       "                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n",
       "            }\n",
       "            for (let i = 0; i &lt; result.length; i++) {\n",
       "                let row = result[i]\n",
       "                for (let j = 0; j &lt; row.length; j++) {\n",
       "                    let cell = row[j]\n",
       "                    if (j === 0)\n",
       "                        cell.leftBd = false\n",
       "                    if (j &lt; row.length - 1) {\n",
       "                        let nextData = row[j + 1]\n",
       "                        if (nextData.leftBd) cell.rightBd = true\n",
       "                        else if (cell.rightBd) nextData.leftBd = true\n",
       "                    } else cell.rightBd = false\n",
       "                }\n",
       "            }\n",
       "            return result\n",
       "        }\n",
       "\n",
       "        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n",
       "            if (result.length === depth) {\n",
       "                const array = [];\n",
       "                if (pos &gt; 0) {\n",
       "                    let j = 0\n",
       "                    for (let i = 0; j &lt; pos; i++) {\n",
       "                        let c = result[depth - 1][i]\n",
       "                        j += c.span\n",
       "                        let copy = Object.assign({empty: true}, c)\n",
       "                        array.push(copy)\n",
       "                    }\n",
       "                }\n",
       "                result.push(array)\n",
       "            }\n",
       "            const col = cols[colId];\n",
       "            let size = 0;\n",
       "            if (col.expanded) {\n",
       "                let childPos = pos\n",
       "                for (let i = 0; i &lt; col.children.length; i++) {\n",
       "                    let child = col.children[i]\n",
       "                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n",
       "                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n",
       "                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n",
       "                    childPos += childSize\n",
       "                    size += childSize\n",
       "                }\n",
       "            } else {\n",
       "                for (let i = depth + 1; i &lt; result.length; i++)\n",
       "                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n",
       "                size = 1\n",
       "            }\n",
       "            let left = leftBorder\n",
       "            let right = rightBorder\n",
       "            if (size &gt; 1) {\n",
       "                left = true\n",
       "                right = true\n",
       "            }\n",
       "            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n",
       "            return size\n",
       "        }\n",
       "\n",
       "        this.getTableElement = function (id) {\n",
       "            return document.getElementById(&quot;df_&quot; + id)\n",
       "        }\n",
       "\n",
       "        this.getTableData = function (id) {\n",
       "            return this.getTableElement(id).df\n",
       "        }\n",
       "\n",
       "        this.createExpander = function (isExpanded) {\n",
       "            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n",
       "            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n",
       "            svg.classList.add(&quot;expanderSvg&quot;)\n",
       "            let path = document.createElementNS(svgNs, &quot;path&quot;)\n",
       "            if (isExpanded) {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n",
       "            } else {\n",
       "                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n",
       "                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n",
       "            }\n",
       "            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n",
       "            svg.appendChild(path)\n",
       "            return svg\n",
       "        }\n",
       "\n",
       "        this.renderTable = function (id) {\n",
       "\n",
       "            let table = this.getTableElement(id)\n",
       "\n",
       "            if (table === null) return\n",
       "\n",
       "            table.innerHTML = &quot;&quot;\n",
       "\n",
       "            let df = table.df\n",
       "            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n",
       "\n",
       "            &sol;&sol; header\n",
       "            let header = document.createElement(&quot;thead&quot;)\n",
       "            table.appendChild(header)\n",
       "\n",
       "            let renderData = this.computeRenderData(df)\n",
       "            for (let j = 0; j &lt; renderData.length; j++) {\n",
       "                let rowData = renderData[j]\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                let isLastRow = j === renderData.length - 1\n",
       "                header.appendChild(tr);\n",
       "                for (let i = 0; i &lt; rowData.length; i++) {\n",
       "                    let cell = rowData[i]\n",
       "                    let th = document.createElement(&quot;th&quot;);\n",
       "                    th.setAttribute(&quot;colspan&quot;, cell.span)\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId];\n",
       "                    if (!cell.empty) {\n",
       "                        if (col.children.length === 0) {\n",
       "                            th.innerHTML = col.name\n",
       "                        } else {\n",
       "                            let link = document.createElement(&quot;a&quot;)\n",
       "                            link.className = &quot;expander&quot;\n",
       "                            let that = this\n",
       "                            link.onclick = function () {\n",
       "                                col.expanded = !col.expanded\n",
       "                                that.renderTable(id)\n",
       "                            }\n",
       "                            link.appendChild(this.createExpander(col.expanded))\n",
       "                            link.innerHTML += col.name\n",
       "                            th.appendChild(link)\n",
       "                        }\n",
       "                    }\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (isLastRow)\n",
       "                        classes += &quot; bottomBorder&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        th.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(th)\n",
       "                }\n",
       "            }\n",
       "\n",
       "            &sol;&sol; body\n",
       "            let body = document.createElement(&quot;tbody&quot;)\n",
       "            table.appendChild(body)\n",
       "\n",
       "            let columns = renderData.pop()\n",
       "            for (let row = 0; row &lt; df.nrow; row++) {\n",
       "                let tr = document.createElement(&quot;tr&quot;);\n",
       "                body.appendChild(tr)\n",
       "                for (let i = 0; i &lt; columns.length; i++) {\n",
       "                    let cell = columns[i]\n",
       "                    let td = document.createElement(&quot;td&quot;);\n",
       "                    let colId = cell.id\n",
       "                    let col = df.cols[colId]\n",
       "                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n",
       "                    if (col.rightAlign)\n",
       "                        classes += &quot; rightAlign&quot;\n",
       "                    if (classes.length &gt; 0)\n",
       "                        td.setAttribute(&quot;class&quot;, classes)\n",
       "                    tr.appendChild(td)\n",
       "                    let value = col.values[row]\n",
       "                    if (value.frameId !== undefined) {\n",
       "                        let frameId = value.frameId\n",
       "                        let expanded = rootDf.expandedFrames.has(frameId)\n",
       "                        let link = document.createElement(&quot;a&quot;)\n",
       "                        link.className = &quot;expander&quot;\n",
       "                        let that = this\n",
       "                        link.onclick = function () {\n",
       "                            if (rootDf.expandedFrames.has(frameId))\n",
       "                                rootDf.expandedFrames.delete(frameId)\n",
       "                            else rootDf.expandedFrames.add(frameId)\n",
       "                            that.renderTable(id)\n",
       "                        }\n",
       "                        link.appendChild(this.createExpander(expanded))\n",
       "                        link.innerHTML += value.value\n",
       "                        if (expanded) {\n",
       "                            td.appendChild(link)\n",
       "                            td.appendChild(document.createElement(&quot;p&quot;))\n",
       "                            const childTable = document.createElement(&quot;table&quot;)\n",
       "                            childTable.className = &quot;dataframe&quot;\n",
       "                            childTable.id = &quot;df_&quot; + frameId\n",
       "                            let childDf = rootDf.childFrames[frameId]\n",
       "                            childTable.df = childDf\n",
       "                            td.appendChild(childTable)\n",
       "                            this.renderTable(frameId)\n",
       "                            if (childDf.nrow !== childDf.totalRows) {\n",
       "                                const footer = document.createElement(&quot;p&quot;)\n",
       "                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n",
       "                                td.appendChild(footer)\n",
       "                            }\n",
       "                        } else {\n",
       "                            td.appendChild(link)\n",
       "                        }\n",
       "                    } else if (value.style !== undefined) {\n",
       "                        td.innerHTML = value.value\n",
       "                        td.setAttribute(&quot;style&quot;, value.style)\n",
       "                    } else td.innerHTML = value\n",
       "                    this.nodeScriptReplace(td)\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "\n",
       "        this.nodeScriptReplace = function (node) {\n",
       "            if (this.nodeScriptIs(node) === true) {\n",
       "                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n",
       "            } else {\n",
       "                let i = -1, children = node.childNodes;\n",
       "                while (++i &lt; children.length) {\n",
       "                    this.nodeScriptReplace(children[i]);\n",
       "                }\n",
       "            }\n",
       "\n",
       "            return node;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptClone = function (node) {\n",
       "            let script = document.createElement(&quot;script&quot;);\n",
       "            script.text = node.innerHTML;\n",
       "\n",
       "            let i = -1, attrs = node.attributes, attr;\n",
       "            while (++i &lt; attrs.length) {\n",
       "                script.setAttribute((attr = attrs[i]).name, attr.value);\n",
       "            }\n",
       "            return script;\n",
       "        }\n",
       "\n",
       "        this.nodeScriptIs = function (node) {\n",
       "            return node.tagName === 'SCRIPT';\n",
       "        }\n",
       "    })()\n",
       "\n",
       "    window.call_DataFrame = function (f) {\n",
       "        return f();\n",
       "    };\n",
       "\n",
       "    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n",
       "    if (funQueue) {\n",
       "        funQueue.forEach(function (f) {\n",
       "            f();\n",
       "        });\n",
       "        funQueue = [];\n",
       "    }\n",
       "})()\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;file: java.nio.file.Path&bsol;&quot;&gt;file&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;.&sol;data.csv&quot;,&quot;.&sol;data1.csv&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;size: Long&bsol;&quot;&gt;size&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;12&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;27&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;data: DataFrame&lt;*&gt;&bsol;&quot;&gt;data&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [{ frameId: 352321559, value: &quot;&lt;b&gt;DataFrame 1 x 3&lt;&sol;b&gt;&quot; },{ frameId: 352321560, value: &quot;&lt;b&gt;DataFrame 1 x 3&lt;&sol;b&gt;&quot; }] }, \n",
       "], id: 352321558, rootId: 352321558, totalRows: 2 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;a: Int&bsol;&quot;&gt;a&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;b: Int&bsol;&quot;&gt;b&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;2&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;c: Int&bsol;&quot;&gt;c&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;3&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "], id: 352321559, rootId: 352321558, totalRows: 1 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "&sol;*&lt;!--*&sol;\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;col1: Double&bsol;&quot;&gt;col1&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;3.0&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;col2: String&bsol;&quot;&gt;col2&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;str&quot;] }, \n",
       "{ name: &quot;&lt;span title=&bsol;&quot;col3: Int&bsol;&quot;&gt;col3&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n",
       "], id: 352321560, rootId: 352321558, totalRows: 1 } ) });\n",
       "&sol;*--&gt;*&sol;\n",
       "\n",
       "call_DataFrame(function() { DataFrame.renderTable(352321558) });\n",
       "\n",
       "\n",
       "        &lt;&sol;script&gt;\n",
       "        &lt;&sol;html&gt;\"></iframe>\n",
       "            <script>\n",
       "                function o_resize_iframe_out_9() {\n",
       "                    let elem = document.getElementById(\"iframe_out_9\");\n",
       "                    resize_iframe_out_9(elem);\n",
       "                    setInterval(resize_iframe_out_9, 5000, elem);\n",
       "                }\n",
       "                function resize_iframe_out_9(el) {\n",
       "                    let h = el.contentWindow.document.body.scrollHeight;\n",
       "                    el.height = h === 0 ? 0 : h + 41;\n",
       "                }\n",
       "            </script>        <html theme='dark'>\n",
       "        <head>\n",
       "            <style type=\"text/css\">\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover > td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "/* formatting */\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       "            </style>\n",
       "        </head>\n",
       "        <body>\n",
       "            <table class=\"dataframe\" id=\"static_df_352321561\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">file</th><th class=\"bottomBorder\" style=\"text-align:left\">size</th><th class=\"bottomBorder\" style=\"text-align:left\">data</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\">./data.csv</td><td  style=\"vertical-align:top\">12</td><td  style=\"vertical-align:top\"><details><summary>DataFrame [1 x 3]</summary><table class=\"dataframe\" id=\"static_df_352321562\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">a</th><th class=\"bottomBorder\" style=\"text-align:left\">b</th><th class=\"bottomBorder\" style=\"text-align:left\">c</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\">1</td><td  style=\"vertical-align:top\">2</td><td  style=\"vertical-align:top\">3</td></tr></tbody></table></details></td></tr><tr><td  style=\"vertical-align:top\">./data1.csv</td><td  style=\"vertical-align:top\">27</td><td  style=\"vertical-align:top\"><details><summary>DataFrame [1 x 3]</summary><table class=\"dataframe\" id=\"static_df_352321563\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">col1</th><th class=\"bottomBorder\" style=\"text-align:left\">col2</th><th class=\"bottomBorder\" style=\"text-align:left\">col3</th></tr></thead><tbody><tr><td  style=\"vertical-align:top\">3.000000</td><td  style=\"vertical-align:top\">str</td><td  style=\"vertical-align:top\">1</td></tr></tbody></table></details></td></tr></tbody></table>\n",
       "        </body>\n",
       "        <script>\n",
       "            document.getElementById(\"static_df_352321561\").style.display = \"none\";\n",
       "        </script>\n",
       "        </html>"
      ],
      "application/kotlindataframe+json": "{\"$version\":\"2.1.1\",\"metadata\":{\"columns\":[\"file\",\"size\",\"data\"],\"types\":[{\"kind\":\"ValueColumn\",\"type\":\"java.nio.file.Path\"},{\"kind\":\"ValueColumn\",\"type\":\"kotlin.Long\"},{\"kind\":\"FrameColumn\"}],\"nrow\":2,\"ncol\":3},\"kotlin_dataframe\":[{\"file\":\"./data.csv\",\"size\":12,\"data\":{\"data\":[{\"a\":1,\"b\":2,\"c\":3}],\"metadata\":{\"kind\":\"FrameColumn\",\"columns\":[],\"types\":[],\"ncol\":3,\"nrow\":1}}},{\"file\":\"./data1.csv\",\"size\":27,\"data\":{\"data\":[{\"col1\":3.0,\"col2\":\"str\",\"col3\":1}],\"metadata\":{\"kind\":\"FrameColumn\",\"columns\":[],\"types\":[],\"ncol\":3,\"nrow\":1}}}]}"
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-28T11:14:54.390225Z",
     "start_time": "2025-05-28T11:14:54.385873Z"
    }
   },
   "cell_type": "code",
   "source": "",
   "outputs": [],
   "execution_count": null
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Kotlin",
   "language": "kotlin",
   "name": "kotlin"
  },
  "language_info": {
   "name": "kotlin",
   "version": "1.9.23",
   "mimetype": "text/x-kotlin",
   "file_extension": ".kt",
   "pygments_lexer": "kotlin",
   "codemirror_mode": "text/x-kotlin",
   "nbconvert_exporter": ""
  },
  "ktnbPluginMetadata": {
   "projectLibraries": []
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
